2014-08-28 5 views
0

Использование Laravel и Eloquent ORM, я пытаюсь определить, существует ли запись в моей базе данных. Это код, я использую, чтобы проверить вещи:Laravel Eloquent ORM существует свойство не работает

$store = Store::where('ext_hash', 'thisHashExists')->first(); 
if($store->exists){ 
     echo 'yes'; 
} 
else{ 
     echo 'no'; 
} 

$another_store = Store::where('ext_hash', 'thisHashDoesNotExist')->first(); 
if($another_store->exists){ 
     echo 'yes'; 
} 
else{ 
     echo 'no'; 
} 

Для первого примера, где хэш существует, она работает правильно, но во втором примере, когда хэш не существует, я получаю ошибка на линии $another_store->exists.

Trying to get property of non-object 

Я предполагаю, что ошибка в том, что объект $ another_store в действительности является не объектом, так как я пытался создать его с помощью статического метода. Как должно использоваться это свойство exists?

Сначала я попытался создать объект, а затем извлек его с помощью нестатических методов, но методы, похоже, не работают таким образом, если я что-то не упускаю. Например:

$store = new Store(); 
$store->where('id', 1)->first(); 
print_r($store); 

Этот код просто выводит пустой Store объект, как если бы where и first методы не имели никакого влияния на него. Это ожидалось?

+0

First() возвращаемые значения являются объектом модели или ноль. Если в результатах нет значения, возвращается значение null. –

+0

Хорошо спасибо. Поэтому, чтобы проверить, существует ли запись, я могу просто проверить, что переменная не равна нулю. Что касается последней части моего вопроса, используя методы типа 'where' на уже созданном объекте. Должно ли это правильно получить объект или методы не могут использоваться таким образом? – flyingL123

ответ

3

Eloquent имеет хороший метод firstOrFail(), который выдает ModelNotFoundException, если ваш запрос не возвращает правильную строку. После этого вы можете либо сделать стандартный try-catch, либо зарегистрировать обработчик ошибок через App::error(function(ModelNotFoundException $e){ Response::make('model not found'); }).

Кроме того, вы можете использовать firstOrNew(), чтобы получить новый экземпляр вашей модели, если он не найден по вашему запросу.

И если вы хотите, чтобы ваш код был как можно более простым, вы можете просто с instanceof Eloquent.

Что касается вашей ошибки - first возвращает объект, он не увлажнять его вызывающему, так что ваш код будет работать, если вы могли бы сделать это:

$store = new Store(); 
$foundStore = $store->where('id', 1)->first(); 
print_r($foundStore); 
+0

Спасибо. Вы знаете о последней части моего вопроса, используя такие методы, как 'where' на уже созданном объекте. Должно ли это правильно получить объект или методы не могут использоваться таким образом? Я спрашиваю, потому что я хотел бы назначать заполняемые свойства на уровне экземпляра, поэтому мне нужно создать экземпляр перед использованием firstOrNew, так как свойства, которые я передаю firstOrNew, вызовут исключение массового присваивания. – flyingL123

+0

На самом деле вы можете передать свойства 'firstOrNew()' как массив вроде этого: '$ user = User :: firstOrNew (array ('name' => 'John'));'. Вы также можете мгновенно сохранить объект в базе данных с помощью: '$ user = User :: firstOrCreate (array ('name' => 'John'));' – Eternal1

+1

Да, но я получал исключение массового присваивания, если я прошел несколько значений для firstOrCreate. Как я могу избежать этого без добавления заполняемых свойств на уровне класса? – flyingL123

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