Laravel 4 如何基于pivot表中两列中的ID返回相关模型(两个外键)?

Laravel 4 如何基于pivot表中两列中的ID返回相关模型(两个外键)?,laravel-4,eloquent,Laravel 4,Eloquent,我设置了一个透视表,其中包含以下列: table - contributions ===================== id - int, pk user_id - int, fk resource_id - int, fk linked_id - int, fk ... 这基本上在用户和资源之间创建了多对多关系。现在,问题是,linked\u id也是一个外键,它指向resources表中的id。在大多数情况下,linked\u id将只是空值,不会成为问

我设置了一个透视表,其中包含以下列:

table - contributions
=====================
id          - int, pk
user_id     - int, fk
resource_id - int, fk
linked_id   - int, fk
...
这基本上在用户和资源之间创建了多对多关系。现在,问题是,
linked\u id
也是一个外键,它指向resources表中的id。在大多数情况下,
linked\u id
将只是空值,不会成为问题。但有时,我希望将贡献链接到用户、资源和其他资源

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

public function contributions()
{
    return $this->hasMany('Contribution');
}
但是如果我对一个ID在linked_ID列中的资源调用它,它不会返回任何结果。当在resource\u ID或linked\u ID列中找到资源ID时,是否有方法返回所有行/关系?(不知何故有第二个$foreignKey值)。

Hm,选项:

1) 创建一个自定义查询,在其中检索资源,加入贡献表,在其中匹配资源对象的当前id上的资源id或链接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\u id列匹配

public function linkedContributions()
{
    return $this->hasMany('Contribution', 'linked_id');
}
并检索数据:

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

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

我在
资源
模型中修改了
贡献
函数,如下所示:

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();
}

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

谢谢!我最终创建了一个类似于您的#1的解决方案。我很快就会把它贴在这里。