gpt4 book ai didi

mysql - Laravel - Eloquent - 基于最新的 HasMany 关系的过滤器

转载 作者:行者123 更新时间:2023-11-29 04:33:53 25 4
gpt4 key购买 nike

我有这两个模型,Leads 和 Status。

class Lead extends Model
{
public function statuses() {
return $this->hasMany('App\LeadStatus', 'lead_id', 'id')
->orderBy('created_at', 'DESC');
}

public function activeStatus() {
return $this->hasOne('App\LeadStatus', 'lead_id', 'id')
->latest();
}


}

class LeadStatus extends Model
{
protected $fillable = ['status', 'lead_id'];
}

这很好用,现在我正在尝试根据最后一个 LeadStatus 的“状态”获取所有 Leads。

我尝试了一些组合但没有成功。

if ($search['status']) {
$builder = $builder
->whereHas('statuses', function($q) use ($search){
$q = $q->latest()->limit(1);
$q->where('status', $search['status']);
});
}



if ($search['status']) {
$builder = $builder
->whereHas('status', function($q) use ($search){
$q = $q->latest()->Where('status', $search['status']);
});
}

有人用 Eloquent 做过这个吗?我需要编写一些原始 SQL 查询吗?

编辑 1:我会再次尝试解释 :D

在我的数据库中,潜在客户的状态不是一对一的关系。那是因为我想要一个潜在客户所拥有的所有状态的历史列表。

这意味着创建潜在客户时,将创建第一个 LeadStatus,其状态为"new"和当前日期。

如果销售人员进来,他可以更改潜在客户的状态,但这不会更新以前的 LeadStatus,而是创建一个新的相关 LeadStatus,当前日期和状态为“打开”。

这样我可以看到潜在客户是在 05/05/2018 上创建的,并且它在 07/05/2018 上更改为“打开”状态。

现在我正在尝试使用 Eloquent 编写查询,它只计算与潜在客户相关的最新状态。

在前面的示例中,如果我按状态为"new"的线索进行过滤,则该线索不应出现,因为它现在的状态为“打开”。

希望对你有帮助

最佳答案

试试这个:

Lead::select('leads.*')
->join('lead_statuses', 'leads.id', 'lead_statuses.lead_id')
->where('lead_statuses.status', $search['status'])
->where('created_at', function($query) {
$query->selectRaw('max(created_at)')
->from('lead_statuses')
->whereColumn('lead_id', 'leads.id');
})->get();

使用主键的解决方案(Borjante):

    $builder->where('lead_statuses.id', function($query) {
$query->select('id')
->from('lead_statuses')
->whereColumn('lead_id', 'leads.id')
->orderBy('created_at', 'desc')
->limit(1);
});

关于mysql - Laravel - Eloquent - 基于最新的 HasMany 关系的过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50218781/

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