Laravel query builder где и или [дублировать]

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

206
задан Adolfo Abegg 22 July 2014 в 22:04
поделиться

11 ответов

Использовать Группировка параметров ( Laravel 4.2 ). Для вашего примера это будет примерно так:

Model::where(function ($query) {
    $query->where('a', '=', 1)
          ->orWhere('b', '=', 1);
})->where(function ($query) {
    $query->where('c', '=', 1)
          ->orWhere('d', '=', 1);
});
332
ответ дан rmobis 19 August 2018 в 19:25
поделиться
YourModel::where(function ($query) use($a,$b) {
    $query->where('a','=',$a)
          ->orWhere('b','=', $b);
})->where(function ($query) use ($c,$d) {
    $query->where('c','=',$c)
          ->orWhere('d','=',$d);
});
0
ответ дан amini.swallow 19 August 2018 в 19:25
поделиться

Вы также можете запросить первое или условие, а затем вы можете применить другое или условие

$model = Model::where('a',1)->orWhere('b',1);

применить другое условие к этой переменной $model

$model1 = $model->where('c',1)->orWhere('d',1)->get();
3
ответ дан benka 19 August 2018 в 19:25
поделиться

Вы также можете использовать области запросов, чтобы сделать вещи немного более аккуратными, поэтому вы можете сделать что-то вроде:

Invoice::where('account', 27)->notPaidAt($date)->get();

Затем в вашей модели

public function scopeNotPaidAt($query, $asAt)
{
    $query = $query->where(function ($query) use ($asAt) { 
        $query->where('paid', '=', '0000-00-00')->orWhere('paid', '>=', $asAt); 
    });
    return $query;    
}
4
ответ дан Leon 19 August 2018 в 19:25
поделиться

$ a, $ b, $ c, $ d могут быть динамическими значениями по запросу

 ->where(function($query) use ($a, $b)
        {
            $query->where('a', $a)
                  ->orWhere('b',$b);
        })
 ->where(function($query) use ($c, $d)
        {
            $query->where('c', $c)
                  ->orWhere('d',$d);
        })
3
ответ дан Majbah Habib 19 August 2018 в 19:25
поделиться

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

User::where('name','ABC')
      ->whereRaw("(age = 25 OR age = 62) AND (position = 'manager' )")
      ->get();
-2
ответ дан Ravindra Bhanderi 19 August 2018 в 19:25
поделиться

Если вы зацикливаете условия OR, вам не нужен второй $ query->, где из других сообщений (на самом деле я не думаю, что вам нужно вообще, вы можете просто использовать orWhere в вложенном месте если проще)

$attributes = ['first'=>'a','second'=>'b'];

$query->where(function ($query) use ($attributes) 
{
    foreach ($attributes as $key=>value)
    {
        //you can use orWhere the first time, dosn't need to be ->where
        $query->orWhere($key,$value);
    }
});
12
ответ дан Sabrina Leggett 19 August 2018 в 19:25
поделиться
  • 1
    Я думаю, вам нужно будет добавить ключевое слово use, чтобы использовать переменную атрибутов внутри. – Meneer Venus 18 July 2015 в 14:40

, если вы хотите использовать круглые скобки в laravel 4 и не забывайте возврат. В Laravel 4 (по крайней мере) вам нужно использовать $ a, $ b в круглых скобках, как в примере

$a = 1;
$b = 1;
$c = 1;
$d = 1;
Model::where(function ($query) use ($a, $b) {
    return $query->where('a', '=', $a)
          ->orWhere('b', '=', $b);
})->where(function ($query) use ($c, $d) {
    return $query->where('c', '=', $c)
          ->orWhere('d', '=', $d);
});

Это мой результат:

11
ответ дан Samrong Prey Kabbas 19 August 2018 в 19:25
поделиться
  • 1
    Спасибо за упоминание использования ($ a, $ b) – mentorgashi 6 January 2016 в 13:48

Просто используйте в Laravel Eloquent:

$a='foo', $b='bar', $c='john', $d='doe';

Coder::where(function ($query) use ($a, $b) {
    $query->where('a', '=', $a)
          ->orWhere('b', '=', $b);
})->where(function ($query) use ($c, $d) {
    $query->where('c', '=', $c)
          ->orWhere('d', '=', $d);
})->get();

Выведет запрос типа:

SELECT * FROM <table> WHERE (a='foo' or b='bar') AND (c='john' or d='doe');
3
ответ дан srmilon 19 August 2018 в 19:25
поделиться

Если вы хотите использовать параметры для a, b, c, d в Laravel 4

Model::where(function ($query) use ($a,$b) {
    $query->where('a', '=', $a)
          ->orWhere('b', '=', $b);
})
->where(function ($query) use ($c,$d) {
    $query->where('c', '=', $c)
          ->orWhere('d', '=', $d);
});
71
ответ дан The Alpha 19 August 2018 в 19:25
поделиться
1
ответ дан Krishnamoorthy Acharya 31 October 2018 в 05:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: