我有两个模型,线索和状态。

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的“状态”获取所有Lead。
我试过几次组合都没有成功。
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']);
                });
        }

有人用雄辩的口才做了这件事吗?我需要编写一些原始SQL查询吗?
编辑1:我再解释一遍:D
在我的数据库中,潜在客户的状态不是1对1关系。这是因为我想要一个历史性的列表,列出一个潜在客户拥有的所有状态。
这意味着在创建Lead时,将创建状态为“new”和当前日期的第一个LeadStatus。
如果销售人员进来,他可以更改销售线索的状态,但这不会更新以前的销售线索状态,而是创建一个当前日期和状态为“打开”的新相关销售线索状态。
这样我就可以看到,Lead是在2018年5月5日创建的,并在2018年5月7日更改为“open”状态。
现在,我试图使用雄辩的方法编写一个查询,它只统计与潜在客户相关的最新状态。
在上一个示例中,如果我按状态为“new”的Lead筛选,则此Lead现在不应显示为状态为“open”。
希望这有帮助

最佳答案

试试这个:

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/

10-11 02:47