当链接firstOrCreate()和with()时,Eloquent查询返回意外结果

时间:2015-09-15 23:26:58

标签: laravel laravel-5 eloquent

初学者问题...我有以下Eloquent查询。它返回了一个Sheets的集合,而不仅仅是一个Sheet似乎是错误的 - firstOrCreate()的文档说它将返回第一行,而不是集合:

// Original query which returns a collection instead of first row
$sheet = Sheet::firstOrCreate(["user_id" => $userId, “date" => $date])->with(“post.tags", “post.categories", “meta")->get();

如果我删除了with(),那么我只会按预期获得一张,但我错过了我的额外数据:

// I get one Sheet as expected but I am missing my extra data
$sheet = Sheet::firstOrCreate(["user_id" => $userId, “date" => $date])->get();

我可以使用first()代替get()来修复它,但这似乎不对:

// Works but seems like the wrong fix    
$sheet = Sheet::firstOrCreate(["user_id" => $userId, “date" => $date])->with(“post.tags", “post.categories", “meta")->first();

它似乎错误的原因是我在查询构建器中有效地指定了两次“获取第一行”。我不确定为什么添加with()会使firstOrCreate返回一个集合。我的语法是否有问题或者这只是一个Laravel怪癖?

谢谢!

1 个答案:

答案 0 :(得分:1)

当您链接这样的方法时,您需要知道您调用的每个方法实际上返回的内容。

这是一个细分:

// your original statement
$sheet = Sheet::firstOrCreate(["user_id" => $userId, "date" => $date])
    ->with("post.tags", "post.categories", "meta")->get();

// is equivalent to this:

// this creates an instance of Sheet
$sheet = Sheet::firstOrCreate(["user_id" => $userId, "date" => $date]);

// this calls with() on the Sheet instance, which returns an Eloquent Query Builder
$sheet = $sheet->with("post.tags", "post.categories", "meta");

// this calls get() on the Query Builder, which returns a Collection of Sheets
$sheet = $sheet->get();

希望这能说明你收集藏品的原因。

对于您的原始问题,因为您在调用firstOrCreate()之后已经有了实例,所以您真正想做的就是为它加载关系。您可以使用load()方法执行此操作:

$sheet = Sheet::firstOrCreate(["user_id" => $userId, "date" => $date])
    ->load("post.tags", "post.categories", "meta");

在使用查询构建器时使用with。如果您已有实例并且想要为其加载关系,请使用load

相关问题