Laravel 用雄辩的语言查询相关表数据
我在尝试从基于相关表的模型中获取记录时遇到问题 我有两个表,一个叫做Laravel 用雄辩的语言查询相关表数据,laravel,eloquent,query-builder,Laravel,Eloquent,Query Builder,我在尝试从基于相关表的模型中获取记录时遇到问题 我有两个表,一个叫做leads,另一个叫做recycle\u logs,我的应用程序基本上会在leads表中发送相同的记录,比如每月发送一次,当它这样做时,我会在recycle\u logs中存储一条新记录 问题是,我需要选择所有具有特定活动id值且具有特定状态的Lead,该状态不同于invalid,迄今为止良好,现在的问题是,我只需要在他们没有任何与其关联的recycleLog或者与特定lead关联的最后一个recycleLog早于30天前的情况
leads
,另一个叫做recycle\u logs
,我的应用程序基本上会在leads
表中发送相同的记录,比如每月发送一次,当它这样做时,我会在recycle\u logs
中存储一条新记录
问题是,我需要选择所有具有特定活动id
值且具有特定状态的Lead
,该状态不同于invalid
,迄今为止良好,现在的问题是,我只需要在他们没有任何与其关联的recycleLog
或者与特定lead
关联的最后一个recycleLog
早于30天前的情况下才能获取它们
我现在拥有的有点像这样
$leads = $this->leadModel->where(Lead::CAMPAIGN_ID, $this->campaignID)
->where(Lead::DUPLICATED, Lead::DUPLICATED_NO)
->where(Lead::LEAD_STATUS, "!=" ,Lead::LEAD_STATUS_INVALID)
->orderBy(Lead::CREATED_AT, 'desc')
->with(
['leadRecyclingLog' => function($query) {
$query->where(LeadRecyclingLog::CREATED_AT, '<', (new Carbon())->subDays($this->configRecyclingDays))
->orWhere(LeadRecyclingLog::ID, null);
}]
)
->get();
试试这个:
$leads = $this->leadModel->where(Lead::CAMPAIGN_ID, $this->campaignID)
->where(Lead::DUPLICATED, Lead::DUPLICATED_NO)
->where(Lead::LEAD_STATUS, "!=" ,Lead::LEAD_STATUS_INVALID)
->orderBy(Lead::CREATED_AT, 'desc')
->where(function($q) {
$q->whereHas('leadRecyclingLog', function($q) {
$q->where(LeadRecyclingLog::CREATED_AT, '<', (new Carbon())->subDays($this->configRecyclingDays));
})
->orWhereHas('leadRecyclingLog', '<', 1); // Where count of the relationship is smaller than 1
})->get();
$leads=$this->leadModel->where(Lead::CAMPAIGN\u ID,$this->CAMPAIGN ID)
->其中(Lead::DUPLICATED,Lead::DUPLICATED\u NO)
->其中(Lead::Lead\u STATUS,“!=”,Lead::Lead\u STATUS\u INVALID)
->订购人(Lead::在“desc”处创建)
->其中(函数($q){
$q->whereHas('leadRecyclingLog',函数($q){
$q->where(LeadRecyclingLog::CREATED_AT,'whereHas(relationship)
,not->with(relationship)
->with(relationship)
将关联结果附加到原始模型(原始模型的查询将不受->with()
的影响)。->whereHas(relationship)
根据条件过滤原始模型。通过@devk的帮助使其工作
$leads = $this->leadModel->where(Lead::CAMPAIGN_ID, $this->campaignID)
->where(Lead::DUPLICATED, Lead::DUPLICATED_NO)
->where(Lead::LEAD_STATUS, "!=" ,Lead::LEAD_STATUS_INVALID)
->orderBy(Lead::CREATED_AT, 'desc')
->where(function($q) {
$q->whereHas('leadRecyclingLog', function($q) {
$q->where(LeadRecyclingLog::CREATED_AT, '<', (new Carbon())->subDays($this->configRecyclingDays));
})
->doesntHave('leadRecyclingLog', 'or');
})->get();
$leads=$this->leadModel->where(Lead::CAMPAIGN\u ID,$this->CAMPAIGN ID)
->其中(Lead::DUPLICATED,Lead::DUPLICATED\u NO)
->其中(Lead::Lead\u STATUS,“!=”,Lead::Lead\u STATUS\u INVALID)
->订购人(Lead::在“desc”处创建)
->其中(函数($q){
$q->whereHas('leadRecyclingLog',函数($q){
$q->where(LeadRecyclingLog::CREATED_AT,'或Where Doesnthave不是查询生成器的方法,因此这也不起作用。我已经成功地在一个简单的MySQL原始查询中复制了我想要的内容,效果很好,如果有帮助的话,我会将其添加到问题中。或者Where Has的第二个参数必须是Closure。通过稍微修改您的查询,它可以起作用,谢谢感谢您的帮助:)
$leads = $this->leadModel->where(Lead::CAMPAIGN_ID, $this->campaignID)
->where(Lead::DUPLICATED, Lead::DUPLICATED_NO)
->where(Lead::LEAD_STATUS, "!=" ,Lead::LEAD_STATUS_INVALID)
->orderBy(Lead::CREATED_AT, 'desc')
->where(function($q) {
$q->whereHas('leadRecyclingLog', function($q) {
$q->where(LeadRecyclingLog::CREATED_AT, '<', (new Carbon())->subDays($this->configRecyclingDays));
})
->doesntHave('leadRecyclingLog', 'or');
})->get();