我有以下 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_store
在 customers
上左加入 customers
。id
= customer_store
.customer_id
在 customer_addresses
上左加入 customer_addresses
。customer_id
= customer_store
。customer_id
哪里
store_id
= 1 且
(customers
.first_name
如“%e%”或 customers
.last_name
如“%e%”或 客户
.电话
,如“%e%”) AND (customer_addresses
.邮政编码
,如“%e%”) AND
customer_store
。deleted_at
为空
我正在努力改变
哪里
store_id
= 1 且
(customers
.first_name
如“%e%”或 customers
.last_name
如“%e%”或 客户
.电话
,如“%e%”) AND (customer_addresses
.邮政编码
,如“%e%”) AND
customer_store
。deleted_at
为空
至
哪里
store_id
= 1 且
(customers
.first_name
如“%e%”或 customers
.last_name
如“%e%”或 客户
.电话
,如“%e%”)或(customer_addresses
.邮政编码
,如“%e%”)或
customer_store
。deleted_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/