Laravel Eloquent ORM关系查询

时间:2014-07-03 05:11:16

标签: laravel eloquent

我需要帮助,查询模型关系时遇到问题。  我实际上知道并使用查询方法完成工作,但我想知道查询关系的“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');
    }

4 个答案:

答案 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()

src:https://coderwall.com/p/xjomzg