объединить оба этих запроса и вернуть тот, который наиболее соответствует - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть $ table , поле is_contain которого равно 1 или 0. У меня есть несколько записей Obj с полями active и is_contain.

Первый сценарий:

$ table-> is_contain = 1

Доступны записи Obj:

  • 'id' = 1 'active' = 1 и 'is_contain' = 0
  • 'id' = 2 'active' = 1 и 'is_contain' = 1

должны возвращать запись Obj, идентификатор которой = 2

Второй сценарий:

$ table-> is_contain = 1

Доступны записи Obj:

  • 'id' = 1 'active' = 1 и 'is_contain' = 0

должны вернуть запись Obj, id = 1

Если $ table-> is_contain = 1 и имеет запись Obj, которая 'is_contain' = 1, затем возвращает эту конкретную запись Obj, которая 'is_contain' = 1, в противном случае возвращает запись, которая 'is_contain' = 0

Сначала Я использовал -> get () как ниже вместо -> first (), но -> get () вернет все две записи Obj, что не то, что я хочу, так как я должен пройти через эти две записи и получить одну с 'is_contain' = 1.

$obj=Obj::whereActive(1)->where(function($query)use($table){
    if($table->is_contain){
        $query->where('is_contain',1)->orWhere('is_contain',0);
    }
})
->get();

Теперь я разделил на две, потому что если использовать -> first (), он всегда будет возвращать Первая коллекция, которой иногда нравится этот пример, поле 'is_contain' записи Obj не равно 1.

$obj=Obj::whereActive(1)->where(function($query)use($table){
    if($table->is_contain){
        $query->where('is_contain',1);
    }
})
->first();

if($obj==null&&$table->is_contain){
    $obj=Obj::whereActive(1)->first();
}

Есть ли способ объединить эти два запроса в один?

1 Ответ

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

Просто закажите по полю is_contain вяло и возьмите первый ряд:

$obj = Obj::whereActive(1);
if ($table->is_contain) {
    $obj = $obj->orderBy('is_contain', 'DESC')->first();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...