2015-02-21 4 views
1

У меня есть модель в laravel и ее нужно вызвать внутри себя, чтобы проверить, есть ли уже записи. Это для общего (полиморфного) случая, когда я не хочу делать это в контроллере.Модель вызова изнутри себя

Это работает просто отлично:

$check = self 
    ::where('foreign_id',$this->attributes['foreign_id']) 
    ->where('foreign_type', $this->attributes['foreign_type']) 
    ->where('category', $this->attributes['category']) 
    ->orderBy('created_at','desc') 
    ->first() 
; 

Теперь я могу получить доступ к свойствам с $ работа стойки> идентификатор, например.

Но я не могу сделать что-то вроде этого:

$check = self 
    ::where('foreign_id',$this->attributes['foreign_id']) 
    ->where('foreign_type', $this->attributes['foreign_type']) 
    ->where('category', $this->attributes['category']) 
    ->orderBy('created_at','desc') 
; 

if($this->isUser()) $check->where('user_id',$this->attributes['user_id']); 
else $check->where('guest_ip',$this->attributes['guest_ip']); 

$check->first(); 

Это не добавление новых Wheres в заявлении, если в запросе.

Я думал, что сам является способ пойти по этому ответу: https://stackoverflow.com/a/15282754/1233206

В моем случае, однако это, кажется, не работает. Что я делаю не так?

+0

Это внутри статическая функция? – lukasgeiter

+0

Нет, это не так. Это публичная функция. Я делаю что-то вроде $ model = new Model; и затем передаю ему некоторые вещи, которые я - внутри модели - обращаются к атрибутам $ this-> [some_attr]. Тогда я называю это как $ model-> check() – sleepless

+0

Хорошо. В опубликованном вами коде вы ничего не делаете с результатом '$ check-> first()'. Попробуйте '$ check = $ check-> first()' – lukasgeiter

ответ

1

$check->first() запустит запрос и возвращает результат. Сама переменная $check не будет изменена. Поэтому, если вы попробуете это:

$check->first(); 
if($check->id == 'something'){} 

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

$check = $check->first(); 
if($check->id == 'something'){} 
+0

Иисус, я так глуп, на самом деле. Большое спасибо! – sleepless

+0

Несомненно, не проблема;) – lukasgeiter

+1

@sleepless: Я бы добавил, что так как имя '$ check' - это две разные вещи (исходное значение и результат от' first() '), вы должны дать им разные имена. IDE (например, NetBeans) жалуются на такое переназначение, поскольку это затрудняет выполнение кода. – halfer

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