如何通过中间表访问用户数据(hasOneThrough / hasManyThrough)

Posted

技术标签:

【中文标题】如何通过中间表访问用户数据(hasOneThrough / hasManyThrough)【英文标题】:How to access to user data through intermediate table (hasOneThrough / hasManyThrough) 【发布时间】:2022-01-08 01:52:51 【问题描述】:

对于一个职位发布申请,我有三个表,它们很快被定义为:

应用:

id 作为主键 job_offer_uuid 作为外部密钥

job_offers:

uuid 作为主键 user_id 作为外部密钥

用户:

只是以 id 作为主键的 laravel 普通用户表

因为我需要在注册应用程序的任何时候通知 job_offer 所有者(用户模型的成员),所以我正在尝试从应用程序到用户创建 hasOneThrough 或 hasManyThrough 关系,但目前没有成功。

澄清: User 模型只托管发布工作机会的用户,并且任何用户都可以发布许多工作机会。 users表中没有申请者

根据我对 eloquent 文档 (https://laravel.com/docs/8.x/eloquent-relationships#has-one-through) 的理解,我在 Application 模型中的实际代码是:

public function publisher()

    return $this->hasOneThrough(User::class, JobOffer::class, 'job_offer_uuid', 'user_id');

但它会触发 SQL 错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'job_offers.job_offer_uuid' in 'field list' (SQL: select `users`.*, `job_offers`.`job_offer_uuid` as `laravel_through_key` from `users` inner join `job_offers` on `job_offers`.`id` = `users`.`user_id` where `job_offers`.`job_offer_uuid` in (1)

改用 hasManyThrough,我得到了一个相同的错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'job_offers.job_offer_uuid' in 'field list' (SQL: select `users`.*, `job_offers`.`job_offer_uuid` as `laravel_through_key` from `users` inner join `job_offers` on `job_offers`.`id` = `users`.`user_id` where `job_offers`.`job_offer_uuid` in (1))

我可以用纯 SQL 得到准确的结果,用这样的一句话:

select applications.id, applications.job_offer_uuid, job_offers.uuid, job_offers.user_id, users.id, users.name, users.email from `applications` inner join job_offers on `applications`.`job_offer_uuid` = `job_offers`.`uuid` join users on job_offers.user_id = users.id where `applications`.id = 1

我发现与这一点相关的任何视频或教程都使用带有中间表外键的最终表,这意味着我的用户模型应该有一个外部 job_offer_id 键,但这对我来说没有意义。

任何澄清都应该非常感激。问候!

【问题讨论】:

【参考方案1】:

你做错了。您必须在用户模型中定义如下关系:

public function publisher()

    return $this->hasOneThrough(
        Application::class,
        JobOffer::class,
        'user_id', // Foreign key on job_offers table
        'job_offer_uuid', // Foreign key on applications table
        'id', // Local key on user table
        'uuid' // Local key on job_offer table
    );

【讨论】:

感谢您的输入 Pradeep Darjee,我会尝试您的解决方案,但似乎它会访问属于特定用户的应用程序记录。在这种情况下,它应该是hasManyThrough,因为用户可以发布许多job_offers。另一方面,一个应用程序只能属于一个工作机会,一个工作机会只能属于一个用户。这就是我在问题末尾发布的纯 SQL 语句可以实现的目标。

以上是关于如何通过中间表访问用户数据(hasOneThrough / hasManyThrough)的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 django 中的父表访问中间表字段?

通过链接到SQL Server数据库的MS Access以多对多关系插入数据(中间表)

Oracle怎么访问其他数据库或者表的用户数据?

通过中间件添加用户的Claim

如何使用标准 django 过滤器访问加入“中间”表?

如何解决mysql enum 类型字段的插入问题