laravel5.4模型關聯查詢的坑

由於工做緣由再次使用laravel,天然也是要寫模型關聯的代碼,好比有自帶的用戶表users和用戶信息表usersinfophp

id,userid,addresshtml

模型名laravel

UsersInfo.php閉包

很簡單的一對一關聯this

user模型內的定義spa

public function HasUsersInfo(){

return $this->hasOne('App\UsersInfo','userid');

}

隨便插了幾條數據(這裏不展現其它數據,由於沒意義)code

用戶表htm

id name
1 gcud
2 gcud2
3 gcud3

用戶信息表ci

id address userid
1 地址1 1
2 地址2 2
3 地址3 3

而後假設我想查詢id>1的用戶名和地址文檔

$Users=User::where('id','>',1)->with('HasUserInfo')
        ->get();
        dd($Users);

結果

array:2 [▼
  0 => array:6 [▼
    "id" => 2
    "name" => "gcud2"
    "email" => "gcud2@163.com"
    "created_at" => null
    "updated_at" => null
    "has_user_info" => array:3 [▼
      "id" => 2
      "address" => "地址2"
      "userid" => 2
    ]
  ]
  1 => array:6 [▼
    "id" => 3
    "name" => "gcud3"
    "email" => "gcud3@163.com"
    "created_at" => null
    "updated_at" => null
    "has_user_info" => array:3 [▼
      "id" => 3
      "address" => "地址3"
      "userid" => 3
    ]
  ]
]

雖然能獲得結果,但列出全部字段的結果並非我想要的,因而如同往常的,我在get裏限定了列

$Users=User::where('id','>',1)->with('HasUserInfo')
        ->get(['name']);
        dd($Users->toArray());

結果

array:2 [▼
  0 => array:2 [▼
    "name" => "gcud2"
    "has_user_info" => null
  ]
  1 => array:2 [▼
    "name" => "gcud3"
    "has_user_info" => null
  ]
]

確實是只剩下名字,但地址也跟着空了,經谷歌搜索和5.4文檔上寫的,好像是要在with關聯裏面寫閉包,指定字段,大概是這個樣子

$Users=User::where('id','>',1)
            ->with(['HasUserInfo'=>function($query){
                $query->select('address');
        }])
        ->get(['name']);
        dd($Users->toArray());

然而結果仍然爲空,不知是我眼拙仍是什麼,我反正是沒在5.4文檔找到模型關聯查詢指定字段的方法,谷歌搜來搜去都是在說要用閉包select來指定字段,就是像上面寫的那樣

當時用谷歌搜索時前幾個老是思否的幾個問題,在別人的問題的幾輪迴復提問下我仍是找到了答案,那就是閉包內和原模型都要傳入關聯字段

$Users=User::where('id','>',1)
            ->with(['HasUserInfo'=>function($query){
                $query->select('userid','address');
        }])
        ->get(['id','name']);
        dd($Users->toArray());

結果

array:2 [▼
  0 => array:3 [▼
    "id" => 2
    "name" => "gcud2"
    "has_user_info" => array:2 [▼
      "userid" => 2
      "address" => "地址2"
    ]
  ]
  1 => array:3 [▼
    "id" => 3
    "name" => "gcud3"
    "has_user_info" => array:2 [▼
      "userid" => 3
      "address" => "地址3"
    ]
  ]
]

真坑,卡了我很一下子,寫這篇文章時我又去搜了谷歌,發現第一條就是就是須要的,雖然沒有明確指明要帶關聯,看看還能能很快知道的

哦,另外還有一個小坑的地方就是模型名稱,從直覺來看,默認狀況下模型名是表名加個s,但若是不仔細看文檔可能會出問題,文檔裏面說了

除非數據代表確地指定了其它名稱,不然將使用類的「蛇形名稱」、複數形式名稱來做爲數據表的名稱。

通常狀況下直接加s是沒問題的,但別忘了說的是複數形式,在英文中某些特殊字母結尾的單詞並非直接加s,好比study的複數形式是studies,也就是說模型名爲Study.php,默認表名得是studies,我也不想去研究英文的複數規則,直接模型裏指定表名就是了

相關文章
相關標籤/搜索