簡體   English   中英

laravel雄辯的關系hasmany查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM