2016-05-23 4 views
2

У меня есть 2 модели, a ServiceInstances Что касается ServiceTypes. Тип сервиса определяет некоторые вещи, и среди них сервис lengthLaravel Область на основе BelongsTo Отношения

В ServiceInstances Я пытаюсь реализовать это «псевдо» логика:

Мне нужно, чтобы получить $ this->ServiceType() -> длина, но не работает

public function scopeExpired($query) { 
    $length = $query->serviceType()->length; 
    return $query->where('created_at', '<', Carbon::now()->subDays($length)); 
} 

Любые идеи?

+1

может быть '$ this-> serviceType-> длина' - без скобок – Yurich

+0

Пробовал, что без успеха - Все, что я получаю другую ошибку: '[ErrorException] Неопределенное свойство: Октябрь \ Rain \ Database \ Builder :: $ serviceType' –

+1

** Области должны изменить запрос, не выполнять его. ** Вы, скорее всего, захотите сделать соединение в таблице типа службы и провести сравнение длины в SQL, а не в PHP. – jfadich

ответ

0

Вызов $query->serviceType() возвращает объект отношений, тогда как $query->serviceType возвращает сама модель (ы). Прямо сейчас он извлекает одну модель, но когда у вас есть отношения oneToMany или manyToMany, он возвращает массив моделей.

Правильный способ делать то, что вы пытаетесь сделать, - это позвонить serviceType без скобок, как показано ниже.

public function scopeExpired($query) { 
    $length = $query->serviceType->length; 
    return $query->where('created_at', '<', Carbon::now()- >subDays($length)); 
} 
+0

Пробовал это без успеха - все, что я получаю, это еще одна ошибка: '[ErrorException] Undefined property: October \ Rain \ Database \ Builder :: $ serviceType' –

1

Вы не должны выполнять запросы из области видимости. Вы можете сделать то же самое с чистым SQL. Попробуй.

public function scopeExpired($query) { 
    return $query 
     ->join('services', 'services.type_id', '=', 'service_types.id') 
     ->whereRaw('TO_DAYS(created_at) < DATE_SUB(NOW()) - service_types.length'); 
} 
Смежные вопросы