我需要帮助,查询模型关系时遇到问题。 我实际上知道并使用查询方法完成工作,但我想知道查询关系的“laravel方式”。
这是我控制器上的内容。 // HealthProfile控制器 // $ id值为2
$health_profiles = User::find($id)->with('health_profiles')->first();
问题是查询的返回值是id = 1而不是id = 2的记录。它基本上忽略了“find”方法。我只想获取特定user_id的健康配置文件。
[id] => 1
[firstname] => patrick
[lastname] => marino
[email] => patrick@gmail.com
[membership_code] => starpatrick
[birthdate] => 1989-05-17
[contact_number] => 1230123
[active] => 1
[created_at] => 2014-07-01 16:10:05
[updated_at] => 2014-07-01 16:10:05
[remember_token] =>
[health_profiles] => Array
(
[0] => Array
(
[id] => 1
[user_id] => 1
[parent_id] =>
[name] => patrick star
[relationship] =>
[gender] => male
[birthdate] => 1989-05-17
[marital_status] =>
[number_of_children] =>
[weigth] =>
[height] =>
[blood_type] =>
[blood_pressure] =>
[hdl] =>
[ldl] =>
[vldl] =>
[visual_activity] =>
[lifestyle] =>
[current_bmi] =>
[weight_goal] =>
[weekly_goal] =>
[rdc] =>
[created_at] => 2014-07-01 16:10:05
[updated_at] => 2014-07-01 16:10:05
)
这是我的架构 //用户模型
public function health_profiles()
{
return $this->hasMany('HealthProfile');
}
// HealthProfile模型
public function user()
{
return $this->belongsTo('User', 'user_id', 'id');
}
答案 0 :(得分:4)
首先说几句:
find($id)
已经运行了查询(它在引擎盖下使用where(id, $id)->first()
),所以把它放在最后,因为现在你无意中做了这个:
User::find($id);
User::with('health_profiles')->first();
另一个问题是,就像您已经注意到的那样,Eloquent
无法使用此设置:
public function health_profiles() ...
$user = User::find($id);
$user->health_profiles; // null
因为在加载动态属性(关系)时,它会在模型上查找camelCased方法。
然而,渴望加载将按预期工作:
$user = User::with('health_profiles')->find($id);
$user->health_profiles; // related model/collection
如果您希望Eloquent
成为您的朋友,那么您绝对应该遵守命名约定;)
但并非全部。它将以相反的方式起作用:
public function healthProfiles() ...
$user = User::find($id);
$user->healthProfiles; // works, returns related model/collection
$user->health_profiles; // works as well, returns the model/collection
总结并回答您的问题,每个都适合您:
// Assuming Profile is the model
// 2 queries
$user = User::find($id);
$profiles = $user->healthProfiles;
// or 1 query
$profiles = Profile::where('user_id', $id)->get();
// or 2 queries: 1 + 1 subquery
$profiles = Profile::whereHas('user', function ($q) use ($id) {
$q->where('users.id', $id);
})->get();
答案 1 :(得分:2)
您可以尝试将with
放在find
之前,以便构建者知道您希望在您尝试查找的内容上加载该关系。
$user = User::with('health_profiles')->find($user_id);
$health_profiles = $user->health_profiles;
答案 2 :(得分:1)
试试这个
User::with('health_profiles')->find($id);
我认为您不需要调用first
方法,因为find
所述,只会找到您需要的一行数据。
答案 3 :(得分:0)
我找到了罪魁祸首。 L4有蛇套方法的问题!我将它更改为camelCase并且它有效。
$lawly = User::where('id', '=', 2)->first();
$lawly->healthProfiles->toArray()