mysql - Eloquent Join,多个where查询,把AND改成OR

标签 mysql laravel eloquent

我有以下 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 是

选择客户.id作为id客户.first_name as firstname, customers.last_name as lastname, customers.电话作为电话

来自customer_storecustomers 上左加入 customersid = customer_store.customer_idcustomer_addresses 上左加入 customer_addressescustomer_id = customer_storecustomer_id

哪里 store_id = 1 且 (customers.first_name 如“%e%”或 customers.last_name 如“%e%”或 客户.电话,如“%e%”) AND (customer_addresses.邮政编码,如“%e%”) AND customer_storedeleted_at 为空

我正在努力改变

哪里 store_id = 1 且 (customers.first_name 如“%e%”或 customers.last_name 如“%e%”或 客户.电话,如“%e%”) AND (customer_addresses.邮政编码,如“%e%”) AND customer_storedeleted_at 为空

哪里 store_id = 1 且 (customers.first_name 如“%e%”或 customers.last_name 如“%e%”或 客户.电话,如“%e%”)或(customer_addresses.邮政编码,如“%e%”)或 customer_storedeleted_at 为空

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

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

最佳答案

解决方案是将所有 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;
}

关于mysql - Eloquent Join,多个where查询,把AND改成OR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45162802/

相关文章:

Java 在 servlet 上下文中存储与数据库查找

php - 在 laravelblade 中显示 LaravelNotification 的数据

php - 如何在 Laravel 中实现组合的交叉连接和内连接?

php - 动态类型语言和远程方法调用

php - 使用 PHP 算出最忙的一天

php - formatErrors() 的声明应该与 laravel 中的 FormRequest::formatErrors 兼容

php - 如何在 Laravel 中实现模型修订?

php - 在 OrderBy desc Eloquent 查询中获取行的排名,我怎样才能使这个查询在 laravel 5.5 eloquents 中工作?)

mysql - Go:出现意外错误

php - Laravel > Eloquent 批量加载