#php #mysql #laravel #mongodb #laravel-backpack
#php #mysql #laravel #mongodb #laravel-backpack
Вопрос:
Я новичок в Laravel и, конечно же, в backpack. Я использую laravel 7.x и backpack 4.1 как с MySQL, так и с MongoDB. Ситуация, с которой я сталкиваюсь, заключается в том, что у меня есть модель компании с некоторыми атрибутами, которые находятся в MySQL (как сохранение, так и обновление отлично работают с атрибутами, хранящимися в MySQL) и другими атрибутами, которые должны храниться в MongoDB. У меня есть модель CompanyPropertyCollection для атрибутов, которые я хочу сохранить в MongoDB, Все эти компании будут иметь переменное количество других произвольных свойств, которые я хочу сохранить в mongo. Эти свойства могут быть простыми скалярными значениями или более сложными значениями (например, массивами объектов), отсюда и идея сохранить их в mongo.
Мой вопрос заключается в следующем: как лучше всего сохранять атрибуты объекта в двух разных базах данных из BackPack? Я переопределяю CreateOperation, UpdateOperation с помощью функций store() и update() примерно так: Модель компании:
class Company extends Model
{
use BackpackCRUDappModelsTraitsCrudTrait;
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 IlluminateDatabaseEloquentRelationsBelongsToMany
*/
public function users()
{
return $this->belongsToMany(AppModelsUser::class);
}
/**
* @return IlluminateDatabaseEloquentRelationsBelongsTo
*/
public function package()
{
return $this->belongsTo(AppModelsPackage::class);
}
public function certification()
{
return $this->hasMany(AppModelsCertification::class);
}
public function properties()
{
return $this->hasOne(AppModelsCompanyPropertyCollection::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',
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'id' => 'integer',
'gallery' => 'array',
];
public function company()
{
return $this->belongsTo(AppModelsCompany::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');
}
}
Комментарии:
1. «Какова наилучшая практика для сохранения атрибутов объекта в двух разных базах данных …» Честное мнение, не надо. Можете ли вы сказать нам, зачем это нужно?
2. Вы получаете ошибку или сталкиваетесь с проблемой, или это работает, и вы просто спрашиваете, есть ли какие-либо рекомендации, которые говорят, что вы должны сделать это по-другому?
3. Необходимость извлекать атрибуты для одной «вещи» из 2 разных баз данных (разных типов) звучит так, как будто с этим было бы сложно работать, 2 разные, но связанные модели, которые я мог видеть, но одна и та же модель? Но, может быть, я неправильно понимаю?
4. @WesleySmith Я добавил еще несколько деталей к вопросу
5. Вы получаете ошибку или сталкиваетесь с проблемой, или это работает, и вы просто спрашиваете, есть ли какие-либо рекомендации, которые говорят, что вы должны сделать это по-другому?
Ответ №1:
Если вам нужно выполнить какое-либо действие после сохранения модели, например, сохранить некоторые пользовательские данные в другой базе данных с другим типом. Вы можете переопределить save
метод модели.
Внутри вашей модели добавьте метод, подобный приведенному ниже
public function save(array $options = array())
{
if (parent::save($options)) {
// Model has been saved in mysql, now save in mongoDB
}
}