Laravel С () вместе с Где () - PullRequest
1 голос
/ 16 апреля 2020

Возьмите в качестве примера следующий красноречивый код:

Customers::with('ShippingMode')
    ->with('PaymentMethod')
    ->with('BarCodes')
    ->where(function($query) use ($find)
    {
        $query->where('name', 'like', "%$find%")
            ->orWhere('vat_number', 'like', "%$find%");
    });

Теперь я хотел бы добавить больше orWhere условий, но с учетом таблицы PaymentMethod, например:

Customers::with('ShippingMode')
    ->with('PaymentMethod')
    ->with('BarCodes')
    ->where(function($query) use ($find)
    {
        $query->where('name', 'like', "%$find%")
            ->orWhere('vat_number', 'like', "%$find%")
            ->orWhere('PaymentMethod.description', 'like', "%$find%");
    });

Но это не работает, так как возвращает ошибку:

Столбец не найден: 1054 Неизвестный столбец 'PaymentMethod.descricao' в 'выражении where'

Я знаю, что если я использую старые объединения, это прекрасно работает:

Customers::select('customer.*')
    ->from('customers AS customer')
    ->leftJoin('payment_methods AS payment_method', 'payment_method.id', '=', 'customer.payment_method_id')
    ->where(function($query) use ($find)
    {
        $query->where('name', 'like', "%$find%")
            ->orWhere('vat_number', 'like', '%$find%')
            ->orWhere('payment_method.description', 'like', '%$find%');
    });

ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ : переменная $find может быть пустой, и когда она пуста, она возвращает все результаты без применения фильтра, что означает, что я не могу использовать функцию whereHas.

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

orWhereHas позволяют добавлять настраиваемые ограничения в ограничение отношений:

Customers::with('ShippingMode')
    ->with('PaymentMethod')
    ->with('BarCodes')
    ->where(function($query) use ($find) {
        $query->where('name', 'like', "%$find%")
            ->orWhere('vat_number', 'like', "%$find%");
    })->orWhereHas('PaymentMethod', function($query) use ($find) {
        $query->where('description', 'like', "%$find%");
    });
0 голосов
/ 16 апреля 2020

Примерно так должно работать:

use Illuminate\Database\Eloquent\Builder;

Customers::with(['ShippingMode', 'PaymentMethod', 'BarCodes'])
    ->when($find, function (Builder $query, $find) {
        $query->where(function (Builder $query) use ($find) {
            $query->where('name', 'like', "%{$find}%")
                ->orWhere('vat_number', 'like', "%{$find}%")
                ->orWhereHas('PaymentMethod', function (Builder $query) use ($find) {
                    $query->where('description', 'like', "%{$find}%");
                });
        });
    })->get();

При when() фильтр будет применяться только тогда, когда $find имеет значение, и он позволяет искать по столбцам Customer с where() / orWhere() и отношения PaymentMethod с orWhereHas().

Подробнее о when() и whereHas() можно прочитать здесь:

при

whereHas

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...