如何根据数据透视表中两列(两个外键)中的 ID 返回相关模型?

     2023-02-16     95

关键词:

【中文标题】如何根据数据透视表中两列(两个外键)中的 ID 返回相关模型?【英文标题】:How do I return related models based on IDs in two columns in pivot table (two foreign keys)? 【发布时间】:2014-11-20 15:50:56 【问题描述】:

我有一个包含以下列的数据透视表:

table - contributions
=====================
id          - int, pk
user_id     - int, fk
resource_id - int, fk
linked_id   - int, fk
...

这基本上在用户和资源之间创建了多对多的关系。现在,问题是,linked_id 也是一个外键,它指向资源表中的 ID。在大多数情况下,linked_id 将只是 null 并且不会成为问题。但有时,我希望将贡献链接到用户、资源和其他资源。

在我的资源模型中,我有以下代码:

public function contributions()

    return $this->hasMany('Contribution');

但是,如果我在其 ID 在linked_id 列中的资源上调用它,则不会返回任何内容。当在 resource_id 或 linked_id 列中找到资源的 ID 时,是否有某种方法可以返回所有行/关系? (不知何故有第二个 $foreignKey 值)。

【问题讨论】:

【参考方案1】:

嗯,选项:

1) 创建一个自定义查询,在其中检索资源,加入贡献表,在其中匹配资源对象中当前 id 上的 resource_id 或 linked_id。

类似:

SELECT R.* 
FROM resources AS R
INNER JOIN contributions AS C ON (
        C.`resource_id` = R.`resource_id`
    OR  C.`linked_id`   = R.`resource_id`
)
WHERE R.`id` = $Resource->id
GROUP BY R.`id`

2) 创建第二个关系方法linkedContributions,它与linked_id 列匹配。

public function linkedContributions()

    return $this->hasMany('Contribution', 'linked_id');

并检索数据:

$Resource = Resource::with(['contributions', 'linkedContributions'])->find(1);

3) 其他想法;您目前只能将 1 个资源链接到另一个资源。如果您创建一个额外的表 + hasMany 'linkedResources' 关系,您将能够将多个资源链接回当前资源。 (这里完全跳过这个问题)

【讨论】:

谢谢!我最终创建了一个类似于您的 #1 的解决方案。我很快就会在这里发布。【参考方案2】:

我在Resource 模型中修改了contributions 函数,如下所示:

public function contributions()

    return DB::table('contributions')
        ->where('resource_id', '=', $this->id)->orWhere('linked_id', '=', $this->id)
        ->join('resources', function($join) 
            $join
                ->on('resources.id', '=', 'contributions.resource_id')
                ->orOn('resources.id', '=', 'contributions.linked_id');
        )
        ->groupBy('contributions.id')
        ->select(
            'contributions.id', 'contributions.description', 'contributions.created_at', 'resources.id AS tileId', 'resources.name AS tileName',
            'users.id AS userId', 'users.username')
        ->get();

链接的贡献现在将显示在两个模型中,而无需为每个链接创建两个条目。

【讨论】:

如何减去 Power Query 数据透视表中的两列?

】如何减去PowerQuery数据透视表中的两列?【英文标题】:HowcanisubtracttwocolumnsinPowerQueryPivottables?【发布时间】:2020-09-1120:06:19【问题描述】:我创建了一个基于PowerQuery数据模型的数据透视表。在NormalPivot表下,我曾经看到可以减... 查看详情

合并数据透视表中的两列

】合并数据透视表中的两列【英文标题】:MergingTwoColumnsinPivotTable【发布时间】:2014-09-0106:47:12【问题描述】:我正在尝试重新格式化我的数据透视表。目前,有两列分别称为已关闭和已完成,它们本质上代表相同的内容。我想... 查看详情

选择数据透视表中的 ID,包括多个数据透视 ID,不包括一个数据透视 ID

...udingonepivotID【发布时间】:2021-10-2002:26:05【问题描述】:如何选择属于两个类别的产品并删除一个类别?示例:我希望只选择属于第一类和第二类的产品,不包括第三类。产品必须同时具有第一类和第二类。如果产品有类别一、... 查看详情

如何比较两个不同表中的两列

】如何比较两个不同表中的两列【英文标题】:HowdoIcomparetwocolumnsfromtwodifferenttables【发布时间】:2020-11-2806:27:22【问题描述】:我正在运行一个CREATETABLETBLASSELECT语句,如下所示。我想写一个CASESTATEMENT来比较X.PRESC_ID列中的值到Y.P... 查看详情

比较数据透视表中计算字段中的两列错误

】比较数据透视表中计算字段中的两列错误【英文标题】:ComparingErrorTwoColumnsinCalculatedFieldinPivotTable【发布时间】:2021-04-2720:00:00【问题描述】:我正在尝试将数据透视表中计算字段中的两列进行比较:=IF(StorageUnit<\'SalesTarg... 查看详情

如何从第三张表中的两个不同表中制作外键?

】如何从第三张表中的两个不同表中制作外键?【英文标题】:Howtomakeforeignkeyfromtwodifferenttableinthirdtable?【发布时间】:2021-09-0112:55:19【问题描述】:我有三个表命名为:Staff(id,name,address);Members(id,name,address);Plans(id,Userid,type);我想... 查看详情

mysql两个表中的信息怎么关联起来使用?

...望能把命令写上,我想照着操作下,谢谢。  mysql两个表中的信息关联起来使用方法:  1、创建主表:  createtableUserInfo(  UserIDintidentity(1,1)primarykey,--递增主键  UserAccountsvarchar(20),  UserNamevarchar(20),  UserPwdvarchar(10)... 查看详情

根据codeigniter中的外键从两个表中获取json编码数据

】根据codeigniter中的外键从两个表中获取json编码数据【英文标题】:Getjsonencodedatafromtwotablesonthebasisofforeignkeyincodeigniter【发布时间】:2018-03-2515:22:25【问题描述】:我有一个问题要问你,我还没有找到解决方案,所以我有2个表:... 查看详情

数据库中的外键

1.数据库中通过外键所连接的关系数据库中的外键一般用以链接接两个表中的两个具有相同意义的字段。如在学生表中有年级id的字段,在年级表中也有年级id的字段,我们不能将年级的具体信息字段也加入学生表中,因为这样违... 查看详情

如何将 DataFrame 中两列中的两个日期和时间合并为一列? [复制]

】如何将DataFrame中两列中的两个日期和时间合并为一列?[复制]【英文标题】:HowtocombinetwodateandtimefromtwocolumnsinDataFrametoonecolumn?[duplicate]【发布时间】:2021-08-1109:27:23【问题描述】:有了这个程序代码df[\'forecast_day\']=pd.to_datetime(df... 查看详情

计算Postgresql中两列之间的运行差异

...间】:2020-09-2419:02:32【问题描述】:我有如下两个表中的数据表1:Material|OrdrQty---------|---------abcd|4253表2:Material|StckQty---------|---------abcd|10 查看详情

如何获取表中两列的唯一值计数?

】如何获取表中两列的唯一值计数?【英文标题】:HowcanIgetcountofuniquevaluesacrosstwocolumnsinatable?【发布时间】:2019-05-0100:13:26【问题描述】:我有一个包含column1和column2以及其他列的表?我需要对取自column1和column2的所有行的唯一... 查看详情

如何使用 laravel 删除数据透视表中的单行

】如何使用laravel删除数据透视表中的单行【英文标题】:Howdodeletesinglerowinpivottablewithlaravel【发布时间】:2020-09-1513:39:03【问题描述】:我想删除数据透视表中的一行数据。我没有收到任何错误,但是当尝试单击按钮时。它没有... 查看详情

如何在 laravel 中使用数据透视表中的 3 个关系创建关系?

】如何在laravel中使用数据透视表中的3个关系创建关系?【英文标题】:Howtocreaterelationsinlaravelwith3relationsinthepivottable?【发布时间】:2019-03-2421:20:20【问题描述】:我在数据库架构中有以下表格:用户(ID、姓名、姓氏)团队(ID... 查看详情

如何编写一个查询,根据 ms 访问的子表中的外键获取信息?

】如何编写一个查询,根据ms访问的子表中的外键获取信息?【英文标题】:howtowriteaquerywhereyougetinformationbasedontheforeignkeyfromachildtableonmsaccess?【发布时间】:2020-02-2315:00:54【问题描述】:我正在编写一个数据库,其中有3个表来存... 查看详情

如何将两个单独表中的两列拆分为视图中的多行?

】如何将两个单独表中的两列拆分为视图中的多行?【英文标题】:HowdoIsplittwocolumnsintwoseparatetablesintojoinedmultiplerowsinaview?【发布时间】:2016-03-2910:01:59【问题描述】:我有两个单独的表格,每个表格都包含字符分隔的单元格。... 查看详情

如何使用数据表从 Laravel 中的数据透视表中检索数据

】如何使用数据表从Laravel中的数据透视表中检索数据【英文标题】:HowtoRetrievedatafromPivottableinLaravelusingDatatables【发布时间】:2020-04-0616:30:55【问题描述】:我正在尝试使用Yajra数据表从数据透视表中检索数据。模型项目.phpclassPr... 查看详情

两个表,一个表中的两列关联另一个表的id,如何将这个表中的两列显示为另一个表id对应的内容

...表,表A设备的用户id和所有者id,表B是用户id对应的名称如何用sql语句显示为下面的表显示为nameuserowermachine1aaabbbmachine2cccddd创建表create table a(name varchar(10),[user] int,owner int)create table b(userid int,username varchar(10))insert into a val... 查看详情