2017-02-03 1 views
0

Для модели I имеет сложное состояние сферы, как так:запросов отношение, которые не является частью сферы в Laravel

class Foo { 
    public function scopeActive(Builder $query) { 
     $dateNow = $now->format('Y-m-d'); 
     $timeNow = $now->second(0)->format('H:i:s'); 
     $query->whereNull('start_date') 
      ->orWhere('start_date', '<', $dateNow) 
      ->orWhere(function (Builder $query) use ($dateNow, $timeNow) { 
       $query->where('start_date', '=', $dateNow) 
        ->where('start_time', '>=', $timeNow); 
      }); 
    } 
} 

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

У меня есть еще один класс так:

class Bar { 
    public function foos() { 
     return $this->hasMany(Foo::class); 
    } 
} 

что означает Bar модель имеет много Foo моделей.

Теперь, если я хочу, чтобы получить все Bar модели, а также все активные Foo модели, которые принадлежат к ней, я могу сделать следующее:

Bar::with(['foo', function (HasMany $query) { 
    $query->active(); 
})->get(); 

Однако, как я могу написать запрос, который дает меня все Bar записей, которые НЕ активны.

В идеале я хотел бы что-то вроде этого:

Bar::with(['foo', function (HasMany $query) { 
    $query->whereNot(function (Builder $query) { 
     $query->active(); 
    }); 
})->get(); 

ответ

0

Там, кажется, не быть эффективный способ легко инвертировать SQL с помощью Laravel для сложных запросов.

Вам просто нужно написать инверсию.

0

Если вы хотите иметь объем, который делает обратное, просто создать другой метод области видимости, как это так, но с перевернутой логикой запроса (вы не включили ваш «Некоторые сложный запрос», так что это только предположение):

public function scopeInactive($query) { 
    return $query->where('is_active', false); 
} 

Laravel: local scopes

+0

Я отредактировал его немного, чтобы дать представление о сложном пространстве. Реальный еще сложнее. Поэтому я не хочу повторять его снова –

+0

К сожалению, нет возможности инвертировать области. Это означает, что вам придется написать тот же сложный запрос, но с инвертированной логикой. – Jeffrey

+0

Лучшей идеей было бы сделать следующее: Добавить дополнительный атрибут вашей модели (например, 'is_active'). Затем настройте расписание, которое регулярно обновляет вашу базу данных. Например: каждый час запрашивайте все _models_, которые являются «слишком старыми» и присваивают атрибуту 'is_active' значение false. Затем вы сможете использовать простую область для определения того, активен ли ваш _model_. – Jeffrey

Смежные вопросы