0

ヌル関係(ポストとカテゴリ)it'sとの適切な関係が設定さ モデル戻っrelation's動的属性が、私は2つのモデルを設定している

class Post extends Model 
{ 
    protected $fillable = [ 
     'title', 
     'excerpt', 
     'body', 
     'featured', 
     'published', 
     'category_id', 
    ]; 

    public function category() 
    { 
     return $this->belongsTo('App\Category'); 
    } 
} 

class Category extends Model 
{ 
    protected $fillable = [ 
     'name', 
    ]; 

    public function posts() 
    { 
     return $this->hasMany('App\Post'); 
    } 
} 

そして、私のPost's保存する方法は

public function store(Request $request) 
{ 
    $post = Post::create($request->all()); 
    return redirect('admin/posts'); 
} 
です

実際には正常に動作しています。category_idをテーブルに設定し、$post->category->nameを使用してすべての動的データを取得できますが、var_dump($post->relation)の場合はnullが返されます。

新しいポストモデルを作成し、すべての属性を設定して保存してから、(公式チャンネルに記載されているように)カテゴリモデルを関連付けると、期待通りにすべてが返されます。

今のところ、動的属性を取得するだけで済みますが、現在はうまく動作していますが、null応答を取得するには何か間違っている必要があります。私の懸念は、今はうまくいくかもしれないということですが、プロジェクトが大きくなると、おそらく大きな問題に直面するでしょう。私はこの問題を解決するために多くの作業をします。

+1

あなたは 'var_dump($ post-> category)'を意味しますか? – alepeino

+0

いいえ、私は本当に 'dd($ post-> category-> name);'を意味していました。私はポストのカテゴリ名であるこのようなことを期待しています。 –

答えて

0

あなたがそれをロードしていないため、関係はありません。それが知っているのは外来キーだけです。それは必ずしもすべてを必要としないので、それがあなたのためにすべての情報をつかんだ場合、それはひどく非効率です。単一のモデルが多くの関係を持つ可能性があるインスタンスを考えます。これは何の理由もない多くのデータベース呼び出しです。

リレーションが必要な場合は、$post->categoryを使用できます。関係はまだロードされていないので、あなたがこれを行うときにそれを得るでしょう。

また、$post->load('category')を使用して読み込むこともできますが、この時点ではPostという1つで作業しているため、実際には役に立ちません。 Postオブジェクトのコレクションがある場合は、$posts->load('category')を使用するメリットが見られるようになります。そうしないと、n + 1の問題が発生します。

したがって、$post->load('category')を使用し、次にvar_dump($post)を使用すると、リレーションがnullではないことがわかります。

+0

基本的には、この場合のように、コレクションを大量に使わず、いくつかの属性を使用しないときに、モデルを関連付けるのではなく、単に外国を設定する方が良いでしょうか? 私のアプリケーションはマルチサイトのCMSです。私は1ページだけを表示し、すべての投稿がリストされているページとしてカテゴリを表示します。だから私に何を提案しますか? –

+0

私はこの場合、外部キーを設定する方が良いと言います。それ以外の場合は、 'Category'を検索して属性を設定した新しい' Post'モデルをインスタンス化し、 'Category'を' Post'に関連付ける必要があります。 – user3158900

+0

素晴らしいです、ありがとうございます! –

関連する問題