【问题标题】:Eloquent Join, multiple where queries, change AND to OREloquent Join,多个where查询,将AND改为OR
【发布时间】:2017-07-18 09:31:46
【问题描述】:

我有以下 Eloquent 查询:

    CustomerStore::restrictBasedOnSession()
        ->joinCustomerWhere([
            ["first_name", "like", "%$query%"],
            ["last_name", "like", "%$query%"],
            ["phone", "like", "%$query%"]
        ])
        ->joinAddressWhere([
            ["postcode", "like", "%$query%"]
        ])
        ->get([
            'customers.id as id',
            'customers.first_name as firstname',
            'customers.last_name as lastname',
            'customers.phone as phone',
        ]);

具有以下作用域

public function scopeJoinCustomerWhere($query, $array)
{
    $query->leftJoin('customers', 'customers.id', '=', 'customer_store.customer_id');

    foreach ($array as $clause) {
        $query->orWhere('customers.' . $clause[0], $clause[1], $clause[2]);
    }

    return $query;
}

public function scopeJoinAddressWhere($query, $array)
{
    $query->leftJoin('customer_addresses', 'customer_addresses.customer_id', '=', 'customer_store.customer_id');

    foreach ($array as $clause) {
        $query->orWhere('customer_addresses.' . $clause[0], $clause[1], $clause[2]);
    }

    return $query;
}


public function scopeRestrictBasedOnSession($query)
{
    return $query->where('store_id', '=', config('app.config.id'));
}

我的问题是,当我为上述 Eloquent 查询转储查询时,我的 SQL 是

选择customers.ididcustomers.first_namefirstnamecustomers.last_namelastname,@9876543332@@。作为phone

来自customer_store 左加入customerscustomers.id = customer_store.customer_id left join customer_addresses on customer_addresses.customer_id = customer_store.customer_id

在哪里 store_id = 1 和 (customers.first_name like '%e%' or customers.last_name like '%e%' or customers.phone like '%e%') AND (customer_addresses.@ 987654354@ like '%e%') 和 customer_store.deleted_at 为空

我正在努力改变

在哪里 store_id = 1 和 (customers.first_name like '%e%' or customers.last_name like '%e%' or customers.phone like '%e%') AND (customer_addresses.@ 987654365@ like '%e%') 和 customer_store.deleted_at 为空

在哪里 store_id = 1 和 (customers.first_name like '%e%' or customers.last_name like '%e%' or customers.phone like '%e%') 或者 (customer_addresses.@ 987654376@ like '%e%') 或 customer_store.deleted_at 为空

具体来说,当我跨多个表执行 where 时,我不希望表之间的条件是 AND,我需要它是 OR

如果有人有任何建议,我将不胜感激

【问题讨论】:

    标签: mysql laravel eloquent


    【解决方案1】:

    解决方案是将所有 where 子句都放在同一范围内,而不是创建多个范围方法。

    Eloquent 查询会将每个范围方法中的子句分组。因此,每个作用域方法都是不同的,并且在 'AND' 中添加了 Eloquent 子句。

    类似这样的:

    public function scopeJoinRelationWhere($query, $array)
    {
        $query->leftJoin('customer_addresses', 'customer_addresses.customer_id', '=', 'customer_store.customer_id');
    
        $query->leftJoin('customers', 'customer.id', '=', 'customer_store.customer_id');
    
        foreach ($array['addresses'] as $clause) {
            $query->orWhere('customer_addresses.' . $clause[0], $clause[1], $clause[2]);
        }
    
        foreach ($array['customers'] as $clause) {
            $query->orWhere('customers.' . $clause[0], $clause[1], $clause[2]);
        }
    
        return $query;
    }
    

    【讨论】:

      猜你喜欢
      • 2014-06-28
      • 2013-06-04
      • 2014-09-27
      • 1970-01-01
      • 2020-06-27
      • 2017-12-21
      相关资源
      最近更新 更多