Laravel красноречивый выбор данных - PullRequest
0 голосов
/ 03 октября 2018

Я хочу создать красноречивый запрос , который создает такой вывод:

SELECT * FROM `banners` WHERE (`channel` = "en-us" OR `channel` IS NULL) AND (`language` = "en" OR `language`IS NULL) AND (`country` = 'us' OR `country` IS NULL) AND `category_id` = "3954" AND `valid_from` <= "2018-10-03 13:20:52" AND `valid_to` >= "2018-10-03 13:20:52" OR `valid_to` IS NULL

Я борюсь с условиями "или" и "и".

Это должно означать, что valid_from, valid_to, channel, language должны иметь значения, но в некоторых случаях «channel» и «language» могут быть нулевыми.

Пожалуйста, помогите мне.Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Я предполагаю, что ваша красноречивая модель Banner

public function valid_banner() {
        $data = $this
            ->where(function ($query) {
                $query
                    ->where('valid_from', '<=', '2018-10-03 13:20:52')
                    ->where('valid_to', '>=', '2018-10-03 13:20:52')
                    ->where('channel', 'en-us')
                    ->where('language', 'en');
            })
            ->orWhere(fucntion($query) {
                $query
                    ->where(function($q) {
                        $q
                            ->where('valid_from', '<=', '2018-10-03 13:20:52')
                            ->whereNull('valid_to');
                    })
                    // i think you can use this (choose one of below)
                    ->orWhereNull('channel')
                    // use this if orWhereNull is not exists
                    ->orWhereRaw("channel IS NULL")

                    // i think you can use this (choose one of below)
                    ->orWhereNull('language')
                    // use this if orWhereNull is not exists
                    ->orWhereRaw("language IS NULL");
            })
            ->where('category_id', 3954)
            // you can skip this condition if you using SoftDeletes
            // read this https://laravel.com/docs/5.6/eloquent#soft-deleting
            ->whereNull($this->getTable(). '.deleted_at')

        ;

        return $data;
}

еще не проверена.но, надеюсь, вы можете получить точку.

0 голосов
/ 03 октября 2018

Это не точный вывод вашего опубликованного запроса, потому что я вижу некоторые синтаксические ошибки в заключительных скобках запроса.поэтому я не могу полностью понять ваш запрос.

Но так как вы указали, что вам трудно понять, как использовать and и or в query builder, я подумал, что это может помочь.

DB::table('banners')
    ->where([                                         //     -|
        ['valid_from', '<=', '2018-10-03 13:20:52'],  // AND  |
        ['valid_to', '>=', '2018-10-03 13:20:52'],    // AND  |
        ['channel', 'en-us'],                         // AND  | OR
        ['language', 'en']                            // AND  |
    ])->orWhere([                                     //     _|____
        ['valid_from', '<=', '2018-10-03 13:20:52'],  // AND  | OR
        ['valid_to', null]                            // AND _|____
    ])->orWhereNull('channel')                        //     _| OR
    ->orWhereNull('language')                         //     _| OR
    ->get();

Удачи

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