【问题标题】:Laravel one to many relationship - get first relationship where it matches conditionLaravel 一对多关系 - 获得符合条件的第一个关系
【发布时间】:2020-01-16 13:00:57
【问题描述】:

在 Laravel 中,我有一个与模型活动具有一对多关系的客户端模型。这种关系简单地定义了需要为特定客户完成的活动。

这是我在我的客户模型中为了获得活动关系而拥有的。 我也有一些条件,因为我只想抓住fdate订购的客户应该完成的活动(跟进日期)。

public function activities() {
    return $this->hasMany('App\Models\Activities', 'ccid')->where('fdate', '!=', '0000-00-00')->where('archive', 'n')->orderBy('fdate', 'DESC');
}

此时我有一些过滤器,我想根据需要在其帐户上完成的活动类型来过滤要检索的客户。例如,我想检索所有具有以下活动的客户:Sale

这就是我获取属于类型匹配的客户端的所有活动的方式。

$clients = Client::with(['activities']);

if(isset($params['type']) && !empty($params['type'])){
        $activityType = $params['type'];
        $clients->whereHas('activities', function($query) use($activityType) {
            $query->where('type', $activityType);
        });
    }

理想情况下,在过滤时,我应该检索所有具有销售活动的客户,按接下来需要完成的最近的活动排序(最近的fdate)。

这似乎在某种程度上起作用,但在某些情况下,客户端对象的活动不仅仅是销售

我怎样才能只获得按最近排序的每个客户的销售活动 (fdate)

【问题讨论】:

    标签: laravel eloquent orm model


    【解决方案1】:

    whereHas 方法将返回具有至少一个 类型活动的客户端。 相反,您可以使用逆向并说

    $clients->whereDoesntHave('activities', function ($query) use ($activityType) {
        $query->where('type', '!=', $activityType);
    });
    

    这将返回所有没有活动类型不是$activityType的客户端

    【讨论】:

    • 不走运
    【解决方案2】:

    尝试从活动方面接近它:

    Activities::where('type', $type)->get();
    

    您还可以将 where() 命令链接到它的末尾,例如:

    Activities::where('type', $type)->where('fdate', '!=', '0000-00-00')->where('archive', 'n')->orderBy('fdate', 'DESC');
    

    如果您以两种方式定义了关系(客户端上的一对多,活动上的多对一),您还应该能够从每个活动模型中获取客户端。

    另外,既然这是一个集合,您可以对其进行任何其他类型的过滤/排序/分组。

    【讨论】:

      猜你喜欢
      • 2019-07-17
      • 2019-11-21
      • 2018-09-27
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多