Как отфильтровать ограничения на загрузку плюс верхний фильтр LIKE - PullRequest
0 голосов
/ 06 марта 2019

У меня есть 2 таблицы: аукционы и свойства .отношение один ко многим.Каждый аукцион содержит много свойств.

Я пытаюсь запросить свойства напрямую, но мне нужно применить предложение WHERE к 2 столбцам: property.desc и auction.code с использованием LIKE .

Вот что у меня есть:

Property::with(['auction'=>function($query) use ($search) {
                $query->orWhere('code', 'LIKE', "%$search%");
            }])->
            where('desc','LIKE', "%$search%")
                ->paginate(10);

Проблема в том, что первый запрос красноречиввыполняет:

SELECT count(*) as aggregate FROM "properties" WHERE "desc"::text LIKE '%df3432sf%'

Поскольку этот запрос ничего не извлекает, Eloquent не идет дальше (я ожидаю также применить фильтр к auction.code .

Это легко сделать с помощью необработанного SQL:

select * from properties p
JOIN auctions a ON a."id" = p.auction_id
WHERE a.code LIKE '%x%'
OR p.desc LIKE '%x%'

Есть идеи?

Спасибо.

Ответы [ 2 ]

1 голос
/ 06 марта 2019

Может быть, это будет работать, так как я не уверен в вашем потоке данных вашего приложения

код:

Property::with('auction', function($q) use($search) {
            $q->where('code', 'LIKE', "%".$search."%");
        })->where('desc','LIKE', "%".$search."%")->get();

Но это даст только те аукционы (необязательно), чья собственностьdesc будет соответствовать вашему поисковому параметру, что сделает весь запрос немного сложным, поэтому я рекомендую пройти аукцион к свойствам, потому что аукцион имеет много свойств, как вы упомянули.Предполагая, что ваша модель аукциона называется Аукционный код:

Auction::with('properties', function($q) use ($search) {
                             $q->where('desc','LIKE', "%".$search."%");
                      })->where('code', 'LIKE', "%".$search."%")->get();

или Если вам нужна еще большая мощность, вы можете использовать методы whereHas и orWhereHas для установки условий "где" в ваших запросах

Property::where('desc','LIKE', "%".$search."%")->orWhereHas('auction', function($q) use($search){ $q->where('code', 'LIKE', "%".$search."%") })->get();

Надеюсь, это поможет.

0 голосов
/ 06 марта 2019

Я бы сделал что-то вроде:

Property::whereRaw('LOWER(`desc`) LIKE ?', '%'.strtolower($search).'%')
    orWhereHas('auction', function($query) use ($search) {
        $query->whereRaw('LOWER(`code`) LIKE ?', '%'.strtolower($search).'%')
    })->paginate(10);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...