代码之家  ›  专栏  ›  技术社区  ›  user3574492

laravel只获取多对多关系中的轴列

  •  3
  • user3574492  · 技术社区  · 7 年前

    我有一个 User Section 通过轴模型建模 UserTrainingSection . 我有一个pivot表,它存储两个表的外键 section_user .

    我还有两个名为 completed completed_date .

    我遇到的问题是,当我获取数据时,它从 用户 与其他轴心列一起建模。

        class Section extends Model
        {
            public $table = "sections";
    
            public $fillable = [
                'id',
                'name',
                'description',
                'parent',
                'position',
                'completion_percentage'
            ];
    
            public function users()
            {
                return $this->belongsToMany(User::class, 'section_user')->using('App\Models\UserTrainingSection')->withPivot('completed', 'completed_date');
            }
        }
    

    在我的api服务中,我像这样获取数据:

    Section::with(['users' => function ($q) {
                    $q->where('users.id', Auth::user()->id);
                }])->first();
    

    如何仅返回透视表列并从用户表中排除这些列?

    目前,它返回如下内容:

    "sections": [
                    {
                        "id": 2,
                        "name": "Subsection 1 training",
                        "description": null,
                        "parent": 1,
                        "position": 2,
                        "completion_percentage": null,
                        "created_at": "2018-05-04 09:54:09",
                        "updated_at": "2018-05-11 09:14:59",
                        "users": [
                            {
                                "id": 1,
                                "name": "Test",
                                "email": "test@test.com",
                                "created_at": "12-04-2018 14:51:42",
                                "updated_at": "2018-04-19 14:14:36",
                                "pivot": {
                                    "section_id": 2,
                                    "user_id": 1,
                                    "completed": 1,
                                    "completed_date": "31/05/2018",
                                    "expires": "31/05/2019"
                                },
                            }
                        ]
                    }
                ]
    

    我想返回的是这样的:

    "sections": [
                        {
                            "id": 2,
                            "name": "Subsection 1 training",
                            "description": null,
                            "parent": 1,
                            "position": 2,
                            "completion_percentage": null,
                            "created_at": "2018-05-04 09:54:09",
                            "updated_at": "2018-05-11 09:14:59",
                            "users": [
                                {
                                    "pivot": {
                                        "section_id": 2,
                                        "user_id": 1,
                                        "completed": 1,
                                        "completed_date": "31/05/2018",
                                        "expires": "31/05/2019"
                                    }
                                }
                            ]
                        }
                    ]
    

    所以我基本上去掉了不需要的用户数据,只返回数据透视。

    2 回复  |  直到 7 年前
        1
  •  2
  •   M Khalid Junaid    7 年前

    根据您的预期输出,我猜您只需要来自连接模型的数据,如果是这种情况,我建议您定义 Section UserTrainingSection

    class Section extends Model
    {
    
        public function training_users()
        {
            return $this->hasMany('App\Models\UserTrainingSection', 'section_id');
        }
        public function users()
        {
            return $this->belongsToMany(User::class, 'section_user')->using('App\Models\UserTrainingSection')->withPivot('completed', 'completed_date');
        }
    }
    

    在查询中,您可以简单地

    Section::with('training_users')->first();
    
        2
  •  0
  •   Matthias S    7 年前

    在你的 with 你要提取的所有语句 User 数据的定义。 您可以添加 select 语句只获取您想要的结果。您可以在模型中的关系中,或者在api中访问模型的位置中添加它。

    例1:

    Section::with(['users' => function ($q) {
        $q->where('users.id', Auth::user()->id)->select('completed', 'completed_date');
    }])->first();
    

    例2:

    public function users()
        {
            return $this->belongsToMany(User::class, 'section_user')->using('App\Models\UserTrainingSection')->withPivot('completed', 'completed_date')->select('completed', 'completed_date');
        }
    

    (未测试)

    See the documentation

    推荐文章