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