gpt4 book ai didi

Laravel 约束关系不会返回数据

转载 作者:行者123 更新时间:2023-12-04 04:12:43 25 4
gpt4 key购买 nike

我正在使用 Laravel 7,我遇到了一个问题,我的约束关系没有返回任何数据:

Domain.php

class Domain extends Model
{
...
public function draws()
{
return $this->hasMany('App\Draw');
}

Controller 中的代码:

    DB::enableQueryLog();

$domain = Domain::with(['draws' => function ($query) {
$query->select(DB::raw('DATE(created_at) as date'), 'ball_1')
->groupBy('date', 'ball_1');
}])->get();

dump($domain->first()->draws); // <---- Should return 2 elements
dd(DB::getQueryLog());

输出

Illuminate\Database\Eloquent\Collection {#336 ▼
#items: [] // <------- returns no elements
}
array:2 [▼
0 => array:3 [▼
"query" => "select * from `domains`"
...
]
1 => array:3 [▼
"query" => "select DATE(created_at) as date, `ball_1` from `draws` where `draws`.`domain_id` in (1) group by `date`, `ball_1`"
...
]
]

如果我执行第二个查询,我可以检索两个预期的元素: Query in Adminer

我在这里做错了什么?

最佳答案

发生这种情况是因为您没有选择外键列。

hasMany 关系的 Laravel 预加载是这样加载的:

首先它对主模型表执行一个查询,在您的例子中是domains 表。它根据结果返回一个主键数组(id 列的列表),例如 1, 2, 3

有了这个ids,它会用where in子句查询相关表:

where domain_id in (1, 2, 3)

这将返回一个列表,该列表将所有draws 加载的域。但此列表尚未与域链接。它将使用来自第二个查询的 domain_id 列来了解哪个 draw 属于每个 domain

如果您没有选择domain_id,它将无法执行最后一步(domain_id对于所有抽奖都将为空)

因此您需要将 domain_id 添加到您的选择中:

Domain::with(['draws' => function ($query) {
$query->select(DB::raw('DATE(created_at) as date'), 'ball_1', 'domain_id')
->groupBy('date', 'ball_1');
}])->get();

或者可能(未测试)您可以只使用 addSelect() 而不是 select() 因为它不会删除 Laravel 创建的原始选择:

Domain::with(['draws' => function ($query) {
$query->addSelect(DB::raw('DATE(created_at) as date'), 'ball_1')
->groupBy('date', 'ball_1');
}])->get();

关于Laravel 约束关系不会返回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61446060/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com