Php 如何在Laravel(背包)中跨两个数据库保存实体

Php 如何在Laravel(背包)中跨两个数据库保存实体,php,mysql,laravel,mongodb,backpack-for-laravel,Php,Mysql,Laravel,Mongodb,Backpack For Laravel,我是拉雷维尔的新手,当然还有背包。 我在MySql和MongoDb中使用Laravel7.x和Backpack4.1。 我面临的情况是,我有一个公司模型,其中一些属性在MySql中(保存和更新对于存储在MySql中的属性都非常有用),而其他属性应该存储在MongoDb中。 对于要存储在MongoDb中的属性,我有一个CompanyPropertyCollection模型 所有这些公司将有一个可变数量的其他任意属性,我想保存在mongo。 这些属性可能是简单的标量值,也可能是更复杂的值(想想对象数

我是拉雷维尔的新手,当然还有背包。 我在MySql和MongoDb中使用Laravel7.x和Backpack4.1。 我面临的情况是,我有一个公司模型,其中一些属性在MySql中(保存和更新对于存储在MySql中的属性都非常有用),而其他属性应该存储在MongoDb中。 对于要存储在MongoDb中的属性,我有一个CompanyPropertyCollection模型 所有这些公司将有一个可变数量的其他任意属性,我想保存在mongo。 这些属性可能是简单的标量值,也可能是更复杂的值(想想对象数组),因此在mongo中保存它们的想法

MySql公司表:

我的问题如下:
从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);
    }
}
公司属性集合模型:

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',
    ];

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

    public function company()
    {
        return $this->belongsTo(\App\Models\Company::class);
    }
}
公司注册控制器:

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
  }
}
  

“将一个实体的属性保存在两个不同的数据库中的最佳做法是什么……”诚实的意见,不要。您能告诉我们为什么需要这样做吗?您是否遇到了错误或遇到了问题,或者它是否有效,您只是在问是否有任何最佳实践表明您应该以不同的方式执行此操作?必须从两个不同的数据库(不同类型)中提取单个“事物”的属性听起来很难处理,我可以看到两种不同但相关的型号,但型号相同?但也许我误解了?@WesleySmith我在问题中添加了更多的细节,你是遇到了错误还是遇到了问题,还是它起作用了?你只是问是否有任何最佳实践表明你应该以不同的方式来做这件事?