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