2016-04-01 25 views
0

我已成立2款(郵政和類別)與it's適當的關係配置模型返回relation's動態屬性,但空關係

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返回。

我如果創建一個新的Post模型,設置所有屬性並保存它,然後關聯Category模型(如官方頻道所記錄的),它將按預期返回所有內容。

現在,我需要的是獲取它的動態屬性,它現在工作正常,但我知道我必須做錯了才能獲得空響應。我擔心的是現在它可能運行良好,但是當項目變得更大時,我可能會遇到更大的問題,並且我將有很多工作來解決這個問題。

+1

你的意思是'var_dump($ post-> category)'? – alepeino

+0

不,我的意思是'dd($ post-> category-> name);'。我確實得到了這樣的預期,這是帖子的分類名稱。 –

回答

0

該關係不存在,因爲您尚未加載它。它所知道的只是外鍵。如果它爲你抓取所有的信息將是非常低效的,因爲它並不總是需要所有這些。想想單個模型可能具有多個關係的實例,這可能是無數次的數據庫調用。

如果您需要該關係,您可以使用$post->category。由於關係還沒有加載,所以當你這樣做的時候它會爲你得到它。

或者您可以使用以下$post->load('category')來加載它,但這並不會真正有益於您,因爲此時您正在使用單個Post。如果您收集了一批Post對象,那麼您會開始看到使用$posts->load('category')的好處,否則最終會出現n + 1問題。

因此,如果您使用$post->load('category'),然後使用var_dump($post),則應該看到該關係不再爲空。

+0

所以,基本上,最好是設置外國人而不是關聯模型,因爲在這種情況下,我不會過多地使用集合和一些屬性? 我的應用程序是一個多站點的CMS,我想我會有儘可能多的頁面,我將只顯示一個帖子,它的類別爲所有帖子列出的頁面。那麼,你會建議我做什麼? –

+0

我會說在這種情況下,最好只設置外鍵。否則,你需要實例化一個新的具有屬性設置的'Post'模型,查詢'Category',然後將'Category'關聯到'Post',這將最終導致更多的查詢。 – user3158900

+0

Awsome,謝謝! –