使用 Eloquent ORM 使用 with 模型關聯查詢,如何處理select不同模型的欄位(欄位名可能相同)

Tacks 發表於 2021-01-18

遇到一個問題,就是articlesarticle_comments兩個資料模型
現在要查出來某個使用者的評論列表(列表包含 評論內容article_comments.content、評論時間article_comments.created_at、評論所屬的文章articles.title)。
我首先需要根據article_comments中的user_id查詢出來對應的評論列表,然後根據評論列表中的article_id,然後找到對應文章標題。

一. 關聯模型(一對多)

  • articles 文章模型
    // 核心方法
    public function comments()
    {
    return $this->hasMany('App\Models\ArticleComment')->orderBy('id', 'desc');
    }
  • article_comments 評論模型
    // 核心方法
    public function article()
    {
      return $this->belongsTo('App\Models\Article');
    }

二. 獲取某個使用者的評論列表

  • 採用關聯模型with (一對多)

    // DB操作,主要是想列印一下sql
    use Illuminate\Support\Facades\DB;
    
    public function comments($id)
    {
       $user = \App\User::find($id);
       if(empty($user)) {
           echo '使用者不存在';
           exit;
       }
    
      DB::connection()->enableQueryLog(); // 開啟查詢日誌
    
      $commentList = ArticleComment::with(['article'=>function($query){
           // 採用閉包進行處理,select出來想要的欄位,但是必須包含關聯外來鍵 id
           return $query->select('title as article_title', 'id');
      }])
      ->where('user_id', $id)
      // 這裡select出來評論模型的欄位,但是也必須要包含外來鍵 article_id
      ->select('content', 'created_at','user_id','id','article_id')
      ->orderBy('id','desc')
      ->get();
    
      // 這個地方可以列印sql,挺不錯的,記錄一下
      foreach (DB::getQueryLog() as $sql) {
          dump($sql['query']);
      }
    
      dd($commentList);
      exit;
    }

最後注意:如果想要指定欄位,使用 select 時,一定要寫兩個表的關聯欄位,不然是查不到關聯關係的。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
Tacks