[英]Laravel Eloquent belongsToMany and hasMany relationship query
[英]laravel eloquent relationship hasmany query
我正在嘗試實現sql查詢
select * from user,comments where comments.user_id= user.id
所以我用以下代碼在用戶模型上創建了一個getcomments
方法
public function comments(){return $this->hasMany('Comments')}
現在正在通過訪問數據
$data = User::find(1)->comments;
但是它只給我注釋表中的數據(而不是用戶和注釋),我該怎么做
雄辯的ORM遵循活動記錄模式。 當您來自編寫純sql語句時,這是考慮建模和與數據進行交互的方式稍有不同。
建立評論關系是一個好步驟。 現在,您需要考慮如何與數據交互。
您可以使用以下語句獲取所有信息:
$user = User::with('comments')->find(1);
使用此語句,所有用戶信息都被加載到$user
對象中,所有注釋信息都被加載到$user->comments
Collection屬性中。 可以像這樣訪問此信息:
// get the info
$user = User::with('comments')->find(1);
// display some user info
echo $user->first_name;
echo $user->last_name;
// loop through the comment Collection
foreach($user->comments as $comment) {
// display some comment info
echo $comment->text;
}
with('comments')
部分告訴查詢渴望為返回的用戶加載所有評論(在這種情況下,僅是ID為1的評論)。 如果您不急於加載它們,則當您嘗試訪問它們時,它們會被自動延遲加載。 如果沒有with('comments')
那么上面的代碼將完全相同。 但是,當您加載多個父記錄而不是僅一個時,渴望加載就變得更加重要,因為它解決了N + 1問題。 您可以在此處閱讀有關急切加載的信息 。
警告(我添加新答案的原因):
User::find(1)->with('comments')->get();
,除非另有說明,否則不會提供您正在尋找的信息。 實際上,這最終將使您的所有用戶都渴望加載其評論。 原因如下:
首先, User::find(1)
將返回一個ID為1的用戶,這很好。 但是,它隨后在此模型上調用with('comments')
,這實際上為users表創建了一個新的查詢構建器實例。 最后,它在這個新的查詢生成器實例上調用get()
,並且由於它沒有任何約束,它將返回表中的所有用戶,並附加所有渴望加載的用戶注釋。
首先找到一個用戶。 然后訪問所有用戶數據以及用戶的所有注釋。
$data = User::find(1);
//or you can use eager loading for more performance. thanks for @Özgür Adem Işıklı
$data = User::with('comments')->find(1);
//access user data
$data->id;
$data->email; //etc.
//user's comments:
foreach($data->comments as $comment) {
//access comment detail
$comment->id;
$comment->title;
}
您僅獲取按ID選擇的用戶的評論。 你應該這樣;
User::find(1)->with('comments')->get();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.