Laravel 多对多 - 意外的结果集 ->select()

2021-12-26 00:00:00 php laravel laravel-5 eloquent

我想知道是否有人可以提供帮助,因为我遇到了困难并且仍在学习 Laravel ORM.任何人都可以解释为什么,当我运行时:

I wonder if anyone can help, as I've hit a wall and still learning Laravel ORM. Can anyone explain why, when I run:

public function locationTags(){
    return $this->hasMany('AppUserHasLocationTags', 'user_id')
        ->join('location_tags AS lt', 'lt.id', '=', 'location_tag_id');
}

我得到了这个结果集:(剪断了...)

I get this result set: (snipped...)

{
    "id": 1,
    "created_at": "2015-05-13 13:04:56",
    "updated_at": "2015-05-13 13:04:56",
    "email": "REMOVED",
    "firstname": "REMOVED",
    "lastname": "REMOVED",
    "location_id": 0,
    "deleted_at": null,
    "permissions": [],
    "location_tags": [
        {
            "user_id": 1,
            "location_tag_id": 1,
            "id": 1,
            "created_at": "2015-05-13 13:06:28",
            "updated_at": "2015-05-13 13:06:28",
            "name": "Test Tag 0",
            "location_id": 1,
            "deleted_at": null
        },
        {
            "user_id": 1,
            "location_tag_id": 2,
            "id": 2,
            "created_at": "2015-05-13 11:40:21",
            "updated_at": "2015-05-13 12:56:13",
            "name": "Test Tag 123",
            "location_id": 1,
            "deleted_at": null
        }
    ]
}

这是王牌!但是,当我开始从 location_tags 连接中选择我想要的列时,使用:

Which is ace! However, when I start to select the columns I want from the location_tags join, with:

public function locationTags(){
    return $this->hasMany('AppUserHasLocationTags', 'user_id')
        ->join('location_tags AS lt', 'lt.id', '=', 'location_tag_id')
        ->select('lt.id', 'lt.name');
}

我最终得到:

{
    "id": 1,
    "created_at": "2015-05-13 13:04:56",
    "updated_at": "2015-05-13 13:04:56",
    "email": "REMOVED",
    "firstname": "REMOVED",
    "lastname": "REMOVED",
    "location_id": 0,
    "deleted_at": null,
    "permissions": [],
    "location_tags": []
}

谁能解释一下这是怎么回事?并可能指出我正确的方向来限制选择?谢谢!

Can someone explain what's going on? And possibly point me in the right direction to limit the selects? Thanks!

更新我也试过:

        $query = AppUser::with(['permissions', 'locationTags' => function($query){
            $query->select('lt.id', 'lt.name');
        }]);

返回相同的结果:(

推荐答案

想通了.这里的关键是你必须包含至少一个 Laravel 可以用来映射结果集的键的 select() 值.就我而言,它是 user_id,如下所示:

Figured it out. The key here was that you must include a select() value of at least one key that Laravel can use to map the result set. In my case it was user_id, like so:

public function locationTags(){
    return $this->hasMany('AppUserHasLocationTags', 'user_id')
        ->join('location_tags AS lt', 'lt.id', '=', 'location_tag_id')
        ->select('user_id', 'lt.name', 'location_tag_id');
}

然后返回一个更好的结果集:

Which then returns a much nicer results set:

{
    "id": 1,
    "created_at": "2015-05-13 13:04:56",
    "updated_at": "2015-05-13 13:04:56",
    "email": "REMOVED",
    "firstname": "REMOVED",
    "lastname": "REMOVED",
    "location_id": 0,
    "deleted_at": null,
    "permissions": [],
    "location_tags": [
        {
            "user_id": 1,
            "name": "Test Tag 0",
            "location_tag_id": 1
        },
        {
            "user_id": 1,
            "name": "Test Tag 123",
            "location_tag_id": 2
        }
    ]
}

希望这对未来的人有所帮助,因为它让我猜了好几个小时.

Hope this helps someone out in the future, because it kept me guessing for a good couple of hours.

相关文章