2015-05-06 74 views
1

我在Grandparent -> Parent -> Child關係中建立了幾個模型,其中每個模型與其下面的關係都具有一對多關係。後端通過使用默認日期created_atmodified_at日期的遷移進行設置,因爲這正是我試圖抓取記錄的日期。通過Laravel 5.0中的關係訪問屬性

我現在有(名稱進行替換):

$parent->child->where('created_at', '=', $date); 

通過echo'ing出來我可以驗證$date正確,在運行時,其中的功能,並在數據庫中記錄相匹配。我基於文檔的期望是這應該返回一個Collection。但是,當我嘗試遍歷它以獲取模型中的每個實例時,出現錯誤,說我試圖訪問非對象的屬性。 (只是試圖回顯出created_at的日期)。

我也試圖把->first()原件後,並假設它會吐出的第一個孩子爲對象,匹配的先決條件,但它出來空,儘管收集不顯示爲空時,類似的測試, 。

我的問題是,有沒有辦法讓first()的方法工作,返回模型的單個實例?類似於:

$parent->child->where('created_at', '=', $date)->first(); 

這是我第一次發佈問題,所以如果你需要更多的信息只是問。

回答

2

您遇到的問題是由於之間的區別:

$parent->child; 

$parent->child(); 

前者($parent->child)是所有子對象的集合,而ŧ他後者($parent->child())是查詢子對象的關係。

你碰到的鬼鬼祟祟的問題是,兩者都支持where()方法,但它們的參數有些不同。您正在使用的參數對於關係查詢中的where()方法可以正常工作,但它們對於Collection中的where()方法不正確,這是您正在使用的方法。

你要麼需要切換到使用關係查詢,或更改參數與where()上收集工作:

$children = $parent->child->where('created_at', $date); 
// or 
$children = $parent->child()->where('created_at', '=', $date)->get(); 

注:where()方法的集合將篩選基礎上,收集字段名稱('created_at')與$ date值相等(==或===)。第三個參數將決定嚴格性(默認爲嚴格(===),或者對於寬鬆(==)使用false)。

1

$parent->child將處理後的查詢作爲集合返回。當您where語句添加到查詢,您將需要使用child方法(它返回一個查詢對象),而不是子屬性:

$parent->child()->where('created_at', '=', $date)->first();