Model返回关系的动态属性但是null关系

时间:2016-04-01 20:45:09

标签: laravel eloquent foreign-keys relationship mass-assignment

我已经设置了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模型(如官方频道中所记录的那样),它将按预期返回所有内容。

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

1 个答案:

答案 0 :(得分:0)

关系不存在因为你没有加载它。它只知道是外键。如果它为您抓取所有信息,那将是非常低效的,因为它并不总是需要所有这些。想想单个模型可能有很多关系的实例,无论如何都会有很多数据库调用。

如果您需要关系,可以使用$post->category。由于关系尚未加载,因此当您执行此操作时,它将为您提供。

或者您可以使用以下$post->load('category')急切加载它,虽然这对您没有任何好处,因为此时您正在使用单个Post。如果您有一组Post个对象,那么您就会开始看到使用$posts->load('category')的好处,否则您最终会遇到n + 1问题。

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