首先,如果我的英语不好,我用谷歌翻译,我道歉。
我想显示销售和采购数据,而不显示任何位置状态类型。
发票表ID,company_id
表交易ID、invoice_id、store_id
我最初使用or where查询,它是安全的,但当我有一些数据时,bug出现了。
错误是,例如,在“进程”选项卡中的数据应该显示交付状态“进程”,但如果您使用下面的查询,它似乎有时所有的状态都是“发送,接收和其他”
查询
$transactions = DB::table('transaction')
->leftJoin('invoice', 'invoice.id', '=', 'transaction.invoice_id')
->leftJoin('company', 'company.id', '=', 'transaction.store_id')
->select(
'transaction.*',
'invoice.id as invoice_id',
'invoice.unique_code as unique_code',
'invoice.second_unique_code as second_unique_code',
'invoice.company_id as inv_company_id',
'invoice.status as status_payment',
'invoice.category_transaction as category_transaction',
'invoice.no_invoice as no_invoice',
'invoice.user_details as user_details',
'transaction_details.course_name as product_name',
'company.id as store_id',
'company.name as store_name',
'company.email as store_email',
'company.phone as store_phone',
'company.logo as store_logo'
)
->where(function ($q) {
// Initialize
$tab = request('tab');
$type = request('transaction_type');
// Validation for status
if ($tab == 1) { // Waiting Approved
$q->where('transaction.status', 0);
} elseif ($tab == 2) { // Being Processed
$q->where('transaction.status', 1);
} else {
$q->where('transaction.status', 2);
}
$q->where('invoice.company_id', auth()->user()->company_id)
->orWhere('transaction.store_id', auth()->user()->company_id);
})
->latest()
->paginate(20);
字符串
有没有一种方法可以用一个orwhere查询来显示这两个数据?或者我需要创建一个新的更好的查询?
我真的需要大家的建议,谢谢。
1条答案
按热度按时间gcuhipw91#
一个可能的解决方案是使用括号对条件进行适当的分组,以确保正确的逻辑。
字符串
在原始查询中,存在AND(where)和OR(orWhere)条件的混合。这意味着它将检索invoice.company_id等于用户的公司ID或transaction.store_id等于用户的公司ID的记录。但是,当与与事务处理状态相关的条件组合时,这将导致意外的结果。
在已回答的查询中,我在现有函数中引入了另一个where函数。这个新函数包含与invoice.company_id和transaction.store_id相关的条件。通过这样做,它将显式地将这些条件分组在一起。嵌套where函数的目的是确保OR条件(orWhere)适用于invoice.company_id和transaction.store_id。
更正后的查询可确保与用户公司ID相关的条件得到正确分组,并且只有当invoice.company_id或transaction.store_id与用户公司ID匹配时(基于嵌套的where函数中的OR逻辑),它才满足总体条件