7

この強力な機能を利用するために、4.1 に移行しました。個々の 'morphedByXxxx' リレーションを取得するときはすべて正しく機能しているように見えますが、特定のタグが属するすべてのモデルを取得しようとすると、エラーが発生するか、結果が得られません。

$tag = Tag::find(45); //Tag model name = 'awesome'

//returns an Illuminate\Database\Eloquent\Collection of zero length
$tag->taggable; 

//returns Illuminate\Database\Eloquent\Relations\MorphToMany Builder class
$tag->taggable();

//returns a populated Collection of Video models
$tag->videos()->get();

//returns a populated Collection of Post models
$tag->posts()->get();

私のタグ モデル クラスは次のようになります。

class Tag extends Eloquent
{
    protected $table = 'tags';
    public $timestamps = true;

    public function taggable()
    {
        //none of these seem to function as expected,
        //both return an instance of MorphToMany

        //return $this->morphedByMany('Tag', 'taggable');
        return $this->morphToMany('Tag', 'taggable');

        //this throws an error about missing argument 1
        //return $this->morphToMany();
    }

    public function posts()
    { 
        return $this->morphedByMany('Post', 'taggable');
    }


    public function videos()
    { 
        return $this->morphedByMany('Video', 'taggable');
    }

}

Post および Video モデルは次のようになります。

class Post extends Eloquent
{
    protected $table = 'posts';
    public $timestamps = true;

    public function tags()
    {
        return $this->morphToMany('Tag', 'taggable');
    }

}

投稿や動画にタグを追加/削除したり、関連する投稿や任意のタグの動画を取得したりできますが、タグ名「awesome」を持つすべてのモデルを取得する適切な方法は何ですか?

4

2 に答える 2

6

それを理解することができました。この実装についてのコメントを楽しみにしています。

Tag.php で

public function taggable()
{
    return $this->morphToMany('Tag', 'taggable', 'taggables', 'tag_id')->orWhereRaw('taggables.taggable_type IS NOT NULL');
}

呼び出しコードで:

$allItemsHavingThisTag = $tag->taggable()
                ->with('videos')
                ->with('posts')
                ->get();
于 2013-09-09T13:58:12.430 に答える
0

これをLaravel 5.2で使用しました(ただし、これが良い戦略かどうかはわかりません):

タグモデル:

public function related()
{
    return $this->hasMany(Taggable::class, 'tag_id');
}

タグ付け可能なモデル:

public function model()
{
    return $this->belongsTo( $this->taggable_type, 'taggable_id');
}

すべての逆関係 (要求されたタグに添付されたすべてのエンティティ) を取得するには:

@foreach ($tag->related as $related)
    {{ $related->model }}
@endforeach

...悲しいことに、この手法は熱心なロード機能を提供せず、ハックのように感じます。少なくとも、適切なモデルの適切な属性を探すことをあまり恐れることなく、関連するモデル クラスを簡単にチェックして、目的のモデル属性を表示できます。

事前に知られていない関係を探しているので、この別のスレッドに同様の質問を投稿しました。

于 2016-09-30T19:44:33.217 に答える