Как сохранить объекты в двух базах данных в Laravel (рюкзак)

#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.

Таблица компаний MySQL: введите описание изображения здесь

Мой вопрос заключается в следующем: как лучше всего сохранять атрибуты объекта в двух разных базах данных из 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
  }
}