初学者问题...我有以下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怪癖?
谢谢!
答案 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
。