gpt4 book ai didi

php - Laravel - whereHas 最后一个关系是 = 'manual'

转载 作者:行者123 更新时间:2023-12-02 16:55:20 25 4
gpt4 key购买 nike

我有一个模型潜在客户,通过 Lead_has_status 表,其状态为“belongsToMany”。

我想要的是获取该潜在客户的最后(当前)状态为“手动”的所有潜在客户。

我已经尝试过了

$leads = Lead::whereHas('statuses', function ($query) use ($q) {
$query->where('description', 'LIKE', '%' . $q . '%');
})->get();

但由于潜在客户仍具有与其关联的旧状态,因此它会返回在某个时刻具有“手动”状态的每个潜在客户。但我只想要当前状态为“手动”的线索。所以我想做一些类似的事情

$leads = Lead::whereLast('statuses', function ($query) use ($q) {
$query->where('description', 'LIKE', '%' . $q . '%');
})->get();

或者

$leads = Lead::whereLast('statuses', function ($query) use ($q) {
$query->latest()->first()->where('description', 'LIKE', '%' . $q . '%');
})->get();

(我知道这不是这样做的方法,它只是表达我想要做的事情)

我希望这个问题有意义,我现在非常困惑。

最佳答案

据我所知,没有内置的 Eloquent 功能可以为您提供这种行为。如果您想仅使用 SQL 来解决此问题,则必须在子查询中使用 SQL 函数 MAX 来查看其他答案,并在 Laravel 代码中添加原始查询(可能是比拒绝不匹配更有效)。

但是,您可以在检索后过滤您的集合并拒绝不符合您条件的元素。

假设变量$q是字符串类型并且包含一个状态,例如: “手动”,类似这样的东西应该可以完成工作(代码未测试)。

$leads = Lead::whereHas('statuses', function ($query) use ($q) {
$query->where('description', 'LIKE', '%' . $q . '%');
})
->with('statuses')
->get()
->reject(function($element) use($q) {
$lastStatus = $element->statuses[count($element->statuses)-1];
return (strpos($lastStatus->description, $q) === false);
});

如果您的列description应包含确切的字符串“manual”,我会这样做:

$leads = Lead::whereHas('statuses', function ($query) {
$query->where('description', 'manual');
})
->with('statuses')
->get()
->reject(function($element) {
$lastStatus = $element->statuses[count($element->statuses)-1];
return $lastStatus->description !== 'manual';
});

whereHas 方法不会删除您需要的任何关系。 whereHas 方法只会说“选择具有一个或多个与此条件匹配的子记录的记录”,但是所有子记录都可以访问,即使是不匹配的记录您的标准,只要家长有符合的标准即可。

您想说的是“选择具有一个或多个符合此条件的子记录 (whereHas) 的记录,然后删除最后一个子记录与我正在寻找的记录(拒绝)”

编辑:使用 ->with('statuses') 更新代码以提高性能。

关于php - Laravel - whereHas 最后一个关系是 = 'manual',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60223533/

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