【问题标题】:Get data from second table with Laravel Eloquent relationship使用 Laravel Eloquent 关系从第二个表中获取数据
【发布时间】:2017-10-18 19:59:05
【问题描述】:

我有表 usersgender

在性别表中有idname(男/女)

users 表中有gender_id

我需要从用户表中获取 json 数据,并根据连接的 ID 从性别表中获取性别名称。使用当前代码,我得到了正确的gender_id,但也得到了所有用户的gender: null。如何在 json 中显示性别表中的姓名?

这就是我所拥有的:

用户模型

public function Gender()
{
    return $this->hasOne('App\Gender', 'id');
}

性别模型

public function User()
{
    return $this->hasMany('App\User', 'gender_id');
}

控制器

$users = User::with('Gender')->paginate(5);
return response()->json($users);

json 响应

{
    "total": 10,
    "per_page": 5,
    "current_page": 1,
    "last_page": 2,
    "next_page_url": "http://test.com/user?page=2",
    "prev_page_url": null,
    "from": 1,
    "to": 5,
    "data": [
        {
        "id": 1,
        "name": "John",
        "surname": "Doe",
        "gender_id": 1,
        "tel": "987654321",
        "email": "john.doe@email.com",
        "gender": null
        }
    ]
}

【问题讨论】:

  • 我认为你的关系应该是User belongsTo Gender而不是hasOne

标签: php mysql laravel laravel-5


【解决方案1】:

我想你在找model mutators

在你的情况下,我应该选择accessor

例如:

public function getGenderNameAttribute()
{
    return ($this->gender) ? $this->gender->name : null;
}

那你就可以$user->gender_name

如果您希望在您的响应中提供此功能,您可以在您的模型中执行:

 protected $appends = ['gender_name'];

【讨论】:

    【解决方案2】:

    通常,用户只有一种性别。因此,您设置了 gender_id 以便稍后调用模型。为了获得性别,您可能会将用户表gender_id 上的性别ID转换为真实模型。所以,belongsTo 应该是正确的。

    用户模型

    public function Gender()
    {
        return $this->belongsTo('App\Gender', 'gender_id', 'id);
    }
    

    拥有方,以我的逻辑思维,一个性别可以被多个用户拥有,也可以有多个用户或类似的短语。

    性别模型

    public function Users()
    {
        return $this->hasMany('App\User', 'gender_id', 'id);
    }
    

    为了更好的命名约定,我在方法中添加了额外的s

    【讨论】:

    • 我还有其他问题。是否可以在模型中声明我想要获取的列?例如,如果性别表在idname 旁边有列status,我想从结果中排除该状态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 2020-07-20
    • 2021-12-10
    • 2020-10-08
    • 2014-03-12
    相关资源
    最近更新 更多