1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

OctoberCMSプラグイン作成:他プラグインのモデルにリレーションを追加する

Posted at

OctoberCMSのドキュメントでは言及されていないが、他のプラグインのモデルのリレーションも拡張することができる。ここでプラグインのモデルを別のプラグインから拡張する方法を説明しているが、モデルオブジェクトが渡されているならもしや、と思ってやってみたらあっさりできた。

下記では既存のbelongsToManyフィールドに項目を追加することでリレーションの定義を追加している。例ではbelongsToManyだが、他のリレーションタイプでも同じはず。

class Plugin extends PluginBase
{
    public function boot()
    {
        Product::extend(function ($model) {
            $model->belongsToMany['parts'] = [
                    'Pikanji\Custom\Models\Part',
                    'table' => 'pikanji_custom_products_parts',
                    'key' => 'product_id',
                    'otherKey' => 'part_id',
                ];
        });
    }

おまけ

下記のようにモデルクラス内で定義するように変数に代入してしまうと、既存のリレーションが定義されている場合、上書きしてしまうので注意。見ればわかりそうなもんだが、なにせ記述しているプラグインが別なので、拡張される側に後からリレーション定義を作成した時にこのミスで数時間ハマった。

            $model->belongsToMany = [
                'parts' => [
                    'Pikanji\Custom\Models\Part',
                    'table' => 'pikanji_custom_products_parts',
                    'key' => 'product_id',
                    'otherKey' => 'part_id',
                ],
            ];

下記の様なエラーが出て、モデルを拡張した覚えがあるなら、チェックしてみる価値はある。

Model 'Pikanji\Ec\Models\Product' does not contain a definition for 'categories'.
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?