3

私はlaravel v3を使い始めたばかりで、ブログを作成して雄弁な1対多の関係に頭を悩ませようとしています。カテゴリと多対1の関係を持つ投稿があります(各投稿はカテゴリにリンクされています)。

次のフィールドを持つ次のテーブルがあります。

投稿: id、タイトル、本文、date_created、category_id

カテゴリ: ID、名前

次の2つのモデルがあります。

class Category extends Eloquent 
{
    public function posts()
    {
        return $this->has_many('Post');
    }
}

class Post extends Eloquent 
{
    public function categories()
    {
        return $this->belongs_to('Category');
    }
}

カテゴリIDを渡してすべての投稿を取得する方法を見つけました:

category::find(2)->posts()->get())

すべての投稿を取得する方法と、対応するカテゴリを取得する方法を見つけるための助けが必要です. したがって、ビューで一日の終わりに、次のようなものを出力できます。

{$post->title} -  Category: {$post->category->name}

助けてくれてありがとう!

4

2 に答える 2

15

これらのヒントがお役に立てば幸いです。

投稿モデルで、categories関数の名前を に変更しますcategory。リレーションは単数であるbelongs_toため、この投稿には 1 つのカテゴリしかありません。

リレーションにも省略形があります。この省略形の構文は、使いやすく、結果がキャッシュされるため便利です。例を次に示します。

$category = Category::find(1);
foreach($category->posts as post) {
    echo $post->title;
}

次に、すべての投稿を関連するカテゴリとともに取得する方法の例を示します。

$posts = Post::all();
foreach($posts as $post) {
    echo $post->category->name;
}

この 2 番目の例を実行するとすぐに気付くことの 1 つは、投稿ごとにクエリ数が増加することです。これは N+1 効果と呼ばれます。たとえば、5 つの投稿がある場合、それらの投稿を取得するために 1 つのクエリが実行されます。次に、ループ内でクエリを実行してカテゴリを取得します。これにより、合計 6 つのクエリが発生します。

この問題を解決するには、熱心な読み込みを使用します。これにより、この例の 6 つのクエリが 2 に減少します。

$posts = Post::with('category')->all();
foreach($posts as $post) {
    echo $post->category->name;
}

それが役立つことを願っています!

于 2012-10-17T19:10:09.133 に答える
0

Laravel 4 の構文はわずかに異なり、camelCase を使用して式を作成します (L3 は snake_Case 構文を使用します)。Laravel の (L4) 新しい構文はPSR-1 準拠になりました。

L3 : $this->belongs_to('Category');
L4 : $this->belongsTo('Category');

「イーガー ローディング」が (データベース クエリを最小限に抑えることで) アプリケーションのパフォーマンスを向上させることを証明するには、Laravel のイベント エコシステムを使用します。

// app/routes.php 
Event::listen('illuminate.query', function($sql) { echo '<h4>' . $sql . '</h4>' ;});

.

于 2013-08-08T20:49:27.863 に答える