web-dev-qa-db-ja.com

Laravel多対多の関係からデータを取得する

学校のプロジェクトでは、LaravelフレームワークでWebサイトを作成しています。コントローラーの多対多のテーブルのデータを処理できません。

これが私のモデルです:

class Item extends Eloquent {
    public function Tags()
    {
        return $this->belongsToMany('Tag', 'items_has_tags', 'items_id', 'tags_id');
    }
}

class Tag extends Eloquent {
    public function LearningMaterials()
    {
        return $this->belongsToMany('LearningMaterial', 'learning_materials_has_tags', 'tags_id', 'learning_materials_id');
    }
}

コントローラ内のアイテムからすべてのタグを繰り返したい:

//get all items
$all = Item::where('public', '1')->get();

foreach($allLm as $item){
     $tags = $item->Tags();

     var_dump('will iterate');

     foreach($tags as $t){
         var_dump('will not iterate');
     }
}

私のコードの何が問題になっていますか?アイテムのタグを処理するにはどうすればよいですか?

参考:私は検索エンジンを作成しています。ユーザーが「mana」などの入力値を挿入すると、「management」というタグが付いたすべてのアイテムが表示されます。

7
Jasper Poppe

LaravelのbelongsToManyメソッドクエリ関連モデルであり、それらを取得しません。これは、クエリにいくつかの追加の制約が必要になる場合があるためです。あなたがする必要があるのは:

$tags = $item->Tags()->get();

または単に:

$tags = $item->Tags;
12
Robo Robok

リレーションシップ関数を呼び出すと、リレーションシップオブジェクト(この場合はBelongsToManyのインスタンス)が返されます。これを使用して、実行する前にクエリにコンポーネントを追加して実行できます。
例えば:

_$only4Tags = $item->Tags()->take(4)->get();
_

リレーションのresultが必要な場合は、get()またはそれより単純なものを呼び出し、magicプロパティを使用します。

_$tags = $item->Tags()->get();
$tags = $item->Tags;
_
7
lukasgeiter