2017-01-18 6 views
2

は、私は、多型イメージ・モデル(public $morphTo = ['imageable' => []];)と、それを使用してPostモデルを持っています。OctoberCMS複数morphOne関係

私はポストイメージ画像を扱うモデルおよび他のいくつかのクラス(記事上での使用の複雑さにより、非常に異なる目的のために2枚のO 3の画像(ポストヘッダー、注目画像と背景画像)

を持つようにしたいです、ページ、など)私はこのような記事でそれを使用することは非常に多くのが好きだろうが、私はmorphOneを使用する理由、各タイプの一つの画像は、それはです。したがって、このようPostモデルにしました:

public $morphOne = [ 
    'header_image' => [ 
     Image::class, 
     'name' => 'imageable' 
    ], 
    'featured_image' => [ 
     Image::class, 
     'name' => 'imageable' 
    ], 
    'background_image' => [ 
     Image::class, 
     'name' => 'imageable' 
    ], 
]; 

しかし、画像を復元するも、常に両方が保存された画像テーブルの最初を取得しているようです。いずれかが最初のレコードを置き換える保存、削除は...など、

を最初のレコードを削除私はおそらくMorphOne関係ごとに1つのレコードを検索し、問題を推測することができ、画像形成性属性のtypeidに一致する最初のを取得します。

質問は次のとおりです。この構造を動作させる方法はありますか?リレーション上のパラメータ、おそらく別のモーフ関係?

ありがとうございました!

+1

試したことがないoctobercmsを私はあなたがそれを別の名前を与えた場合、 '「名前」=>「imageable''何が起こるか疑問に思う:私は、いずれかの$model->beforeFilter()でそれを実装しました。 **編集**または恐らく、画像テーブルに追加の列(可能な場合)を得、ちょうど[この例では】など(https://laracasts.com/discuss/channels/general-discussion/multiple-polymorphic-relations-オン・ワン・モデル)。 –

+1

関係条件を使用して10月に実際にこの同じソリューションを実装しました。下の私の答えを見てください! –

+1

私は、その多面的な関係を操作するその興味深い方法を参照してください。 –

答えて

1

私は、複数のmorphOne関係を使用する方法を発見しました。

あなただけの関係とデータをフィルタリングするための列に、有効範囲や条件を追加する必要があります。

public function scopeHeaderImage($query) { 
    $query->where('image_type', "header_image"); 
} 

public function scopeFeaturedImage($query) { 
    $query->where('image_type', "featured_image"); 
} 

その関係上:

public $morphOne = [ 
    'header_image' => [ 
     \NewCriterion\Content\Models\Image::class, 
     'name' => 'imageable', 
     'scope' => 'headerImage' 
    ], 
    'featured_image' => [ 
     \NewCriterion\Content\Models\Image::class, 
     'name' => 'imageable', 
     'conditions' => "image_type = 'featured_image'" 
    ] 
]; 

どちらの方法が有効である、とスコープ(生を使用して直接上にモデルのメソッドを使用するか、WHERE条件)これが正しく動作するために、あなたはM、という

注意この情報をデータベースに保存しないでください。 (まだ - しかし、いくつかのlaravelのバックグラウンドを持っていた)

$model->header_image->image_type = "header_image"; 
$model->featured_image->image_type = "featured_image";