2016-04-01 27 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,谢谢! –