模型返回关系的动态属性但为空关系

Posted

技术标签:

【中文标题】模型返回关系的动态属性但为空关系【英文标题】:Model returns relation´s dynamic attributes but null relation 【发布时间】:2016-07-21 19:19:24 【问题描述】:

我设置了 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 的存储方式是

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 模型(如官方频道所述),它将按预期返回所有内容。

现在,我只需要获取它的动态属性,它现在工作正常,但我知道我必须做错事才能获得空响应。我担心它现在可能工作正常,但是当项目变得更大时,我可能会面临更大的问题,我将有很多工作来解决这个问题。

【问题讨论】:

你的意思是var_dump($post->category) ? 不,我的意思是dd($post->category->name);。我确实得到了这样的预期,这是帖子的类别名称。 【参考方案1】:

该关系不存在,因为您尚未加载它。它只知道外键。如果它为您获取所有这些信息,那将是非常低效的,因为它并不总是需要所有这些信息。想想一个模型可能有许多关系的实例,这将是无缘无故的许多数据库调用。

如果需要关系,可以使用$post->category。由于该关系尚未加载,因此在您执行此操作时它会为您获取。

或者您可以通过使用以下$post->load('category') 预先加载它,尽管这对您并没有真正的好处,因为此时您正在使用单个Post。如果您有一个 Post 对象的集合,那么您将开始看到使用 $posts->load('category') 的好处,否则您最终会遇到 n + 1 问题。

因此,如果您使用$post->load('category'),然后使用var_dump($post),您应该会看到关系不再为空。

【讨论】:

所以,基本上,当我没有太多使用集合和一些属性时,最好只设置外部而不是关联模型,就像在这种情况下一样?我的应用程序是一个多站点 CMS,我想我将有尽可能多的页面,我将只显示一个帖子,它的类别与列出所有帖子的页面一样。那么你会建议我做什么?跨度> 我会说在这种情况下,最好只设置外键。否则,您需要使用属性集实例化一个新的Post 模型,查询Category,然后将您的Category 关联到您的Post,这最终会导致更多的查询而不是必要的。

以上是关于模型返回关系的动态属性但为空关系的主要内容,如果未能解决你的问题,请参考以下文章

返回对象不为空但为空

Laravel Eloquent ORM 无法正确返回模型的关系

基于返回 NULL 的关系的核心数据属性

将对象返回为 json 时访问雄辩的关系

Laravel 动态关系 - 在急切加载时访问模型属性

在 Eloquent 属性中返回查询的模型