如何在LaravelBackpack中跨两个数据库保存实体

问题描述

我是Laravel的新手,当然还有背包。 我在MysqL和MongoDb上使用laravel 7.x和背包4.1。 我面临的情况是,我有一个公司模型,其中包含一些MysqL中的属性(保存和更新对于MysqL中存储的属性都非常有用)和其他应存储在MongoDb中的属性我有一个要存储在MongoDb中的属性的CompanyPropertyCollection模型 所有这些公司将具有可变数量的其他任意属性,我想保存在mongo中。 这些属性可能是简单的标量值,也可能是更复杂的值(请考虑对象数组),因此可以将它们保存在mongo中。

MysqL Company表:

enter image description here

我的问题如下: 将实体的属性保存在BackPack的两个不同数据库中的最佳实践是什么?我用store()和update()函数重写CreateOperation,UpdateOperation,如下所示: 公司型号:

class Company extends Model
{
    use \Backpack\CRUD\app\Models\Traits\CrudTrait;
    use SoftDeletes;

    use HybridRelations;

    protected $connection = 'MysqL';

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name','company_type','is_active','package_id','certification_id',];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'id' => 'integer','is_active' => 'boolean','package_id' => 'integer','certification_id' => 'integer',];

    /**
     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
     */
    public function users()
    {
        return $this->belongsToMany(\App\Models\User::class);
    }

    /**
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function package()
    {
        return $this->belongsTo(\App\Models\Package::class);
    }

    public function certification()
    {
        return $this->hasMany(\App\Models\Certification::class);
    }

    public function properties()
    {
        return $this->hasOne(\App\Models\CompanyPropertyCollection::class);
    }
}

CompanyPropertyCollection模型:

class CompanyPropertyCollection extends Model
{
    use SoftDeletes;

    protected $connection = 'mongodb';

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        //'company_id','email','big_news_id','phone.number','phone.country_prefix','phone.area_prefix','phone.postfix','year_of_foundation','nr_of_employees','nr_of_branches','company_size','subtitle','homepage','country_code','city','street','post_code','uid_nr','registration_nr','total_sales_area','total_annual_bisuness_volume','short_portrait','long_portrait','embedded_video','certificates','gallery','gallery' => 'array',];

    public function company()
    {
        return $this->belongsTo(\App\Models\Company::class);
    }
}

CompanyCrudController:

public function update()
{
    //$this->update( $company->properties);

    $response = $this->traitUpdate();
    // do something after save

    //use registered observer

    return $response;
} 

当前,我正在尝试使用CompanyObserver并进行保存以存储来自请求的mongo数据。

class CompanyObserver {

    public function saving(Company $company)
    {
        //dd(request()->request);
        $request = request()->request;

        dd($company->properties());

        //save to MongoDb
        dd('saving methond on the observer');
    }
}

解决方法

如果您需要在保存模型后执行某些操作,例如将一些用户数据保存在其他类型的数据库中。您可以覆盖模型的save方法。

在模型内部,添加如下所示的方法

public function save(array $options = array())
{
  if (parent::save($options)) {
      // Model has been saved in mysql,now save in mongoDB
  }
}
  

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...