You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Eloquent多选项过滤需求:实现账户多选筛选营收数据

Hey there! Let's tweak that account filter to support all, single, or multiple selections—here's how to modify your Laravel form and backend logic step by step:

Frontend Form Updates

First, we'll replace the single account selector with a checkbox group, plus a "All Accounts" toggle for better user experience:

{!! Form::open(['url' => 'incomes/revenues', 'role' => 'form', 'method' => 'GET']) !!}
    <div class="pull-left">
        <span class="title-filter hidden-xs">{{ trans('general.search') }}</span>
        
        <!-- All Accounts Checkbox -->
        <div class="form-group">
            {!! Form::checkbox('all_accounts', '1', request('all_accounts', true), ['id' => 'all_accounts']) !!}
            {!! Form::label('all_accounts', trans('general.all_accounts')) !!}
        </div>

        <!-- Multiple Account Checkboxes -->
        <div class="form-group" id="account_checkboxes" style="{{ request('all_accounts', true) ? 'display: none;' : '' }}">
            @foreach($accounts as $account)
                <div class="checkbox">
                    {!! Form::checkbox('accounts[]', $account->id, in_array($account->id, request('accounts', [])), ['class' => 'account-checkbox']) !!}
                    {!! Form::label('accounts[]', $account->name) !!}
                </div>
            @endforeach
        </div>

        <!-- Keep your existing filter fields here (date ranges, etc.) -->
        <!-- ... -->

        <button type="submit" class="btn btn-default">{{ trans('general.search') }}</button>
    </div>
{!! Form::close() !!}

<!-- Add small JS for UX toggling -->
<script>
    const allAccountsCheckbox = document.getElementById('all_accounts');
    const accountContainer = document.getElementById('account_checkboxes');
    const accountCheckboxes = document.querySelectorAll('.account-checkbox');

    allAccountsCheckbox.addEventListener('change', function() {
        if (this.checked) {
            accountContainer.style.display = 'none';
            accountCheckboxes.forEach(box => {
                box.checked = false;
                box.disabled = true;
            });
        } else {
            accountContainer.style.display = 'block';
            accountCheckboxes.forEach(box => box.disabled = false);
        }
    });

    // Initialize disabled state on page load
    if (allAccountsCheckbox.checked) {
        accountCheckboxes.forEach(box => box.disabled = true);
    }
</script>

Key Frontend Changes:

  • We use accounts[] as the checkbox name so Laravel receives an array of selected account IDs.
  • The "All Accounts" checkbox defaults to checked (matching your original behavior), and hides/disables individual account options when selected.
  • We preserve the selected state of checkboxes after form submission using in_array($account->id, request('accounts', [])).
Backend Controller Logic

Now update your revenues method to handle the multiple account selections:

public function revenues(Request $request)
{
    // Start with the base revenue query
    $revenues = Revenue::query();

    // Handle account filtering
    if (!$request->has('all_accounts') || !$request->all_accounts) {
        if ($request->has('accounts') && is_array($request->accounts)) {
            // Validate selected accounts exist in the database (optional but recommended)
            $request->validate([
                'accounts' => 'array',
                'accounts.*' => 'exists:accounts,id'
            ]);
            
            $revenues->whereIn('account_id', $request->accounts);
        }
        // Optional: Add fallback logic if no accounts are selected (e.g., return empty results or show a warning)
    }

    // Apply other filters (date ranges, status, etc.) here
    // ...

    // Fetch filtered results
    $revenues = $revenues->get();

    // Pass accounts collection to the view (from your database, e.g., $accounts = Account::all())
    return view('incomes.revenues', compact('revenues', 'accounts'));
}

Key Backend Notes:

  • We first check if "All Accounts" is not selected. If that's the case, we use whereIn to filter revenues by the selected account IDs.
  • The optional validation ensures only valid account IDs are processed, preventing invalid database queries.
Bonus Tips
  • If you prefer a dropdown-style multi-select instead of checkboxes, use Form::select('accounts[]', $accountOptions, request('accounts'), ['multiple' => true, 'size' => 5])—adjust the size to fit your UI.
  • Add clear visual feedback for selected checkboxes (e.g., custom CSS) to make the UI more intuitive.

内容的提问来源于stack exchange,提问作者AVN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:42:41