2014-08-28 59 views
0

使用Laravel和Eloquent ORM,我试图确定一条记录是否存在于我的数据库中。这是我使用的是要进行测试的代码:Laravel雄辩的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对象,仿佛wherefirst方法对对其没有影响。这是预期的吗?

+0

首先()的返回值是Model对象或空值。如果结果中没有值,则返回null。 – 2014-08-28 15:34:13

+0

好的谢谢。所以要检查记录是否存在,我可以检查变量是否为空。对于我的问题的最后一部分,使用像已经实例化的对象上的“where”这样的方法呢?应该正确地检索一个对象还是不能以这种方式使用这些方法? – flyingL123 2014-08-28 15:37:10

回答

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 2014-08-28 15:43:00

+0

实际上,你可以像这样将一个属性传递给'firstOrNew()':'$ user = User :: firstOrNew(array('name'=>'John'));'。你也可以立即将一个对象保存到数据库中:'$ user = User :: firstOrCreate(array('name'=>'John'));' – Eternal1 2014-08-28 15:46:59

+1

是的,但是我得到一个批量赋值异常,如果我通过多个值firstOrCreate。如何避免在课堂级别添加可填充属性? – flyingL123 2014-08-28 15:49:08