php 或者Laravel中的Where Complex加入

rsl1atfo  于 2023-11-16  发布在  PHP
关注(0)|答案(1)|浏览(124)

首先,如果我的英语不好,我用谷歌翻译,我道歉。
我想显示销售和采购数据,而不显示任何位置状态类型。
发票表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查询来显示这两个数据?或者我需要创建一个新的更好的查询?
我真的需要大家的建议,谢谢。

gcuhipw9

gcuhipw91#

一个可能的解决方案是使用括号对条件进行适当的分组,以确保正确的逻辑。

->where(function ($q) {
    $tab    = request('tab');
    $type   = request('transaction_type');

    // Validation for status
    if ($tab == 1) {
        $q->where('transaction.status', 0);
    } elseif ($tab == 2) {
        $q->where('transaction.status', 1);
    } else {
        $q->where('transaction.status', 2);
    }

    $q->where(function ($subq) {
        $subq->where('invoice.company_id', auth()->user()->company_id)
            ->orWhere('transaction.store_id', auth()->user()->company_id);
    });
})

字符串
在原始查询中,存在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逻辑),它才满足总体条件

相关问题