2014-08-28 60 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