Laravel 5.5两个关系在同一张桌子上

时间:2017-09-22 13:31:29

标签: laravel laravel-5 laravel-eloquent

这是我的情景。

我有一张名为' team'的桌子。和laravel用户'表

我试图在团队和用户之间建立两个关系,以便'所有者'另一个是经理'

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;


class Team extends Model
{
    protected $table = 'team';

    public function owner(){
        return $this->belongsTo(User::class, 'id');
    }

    public function manager(){
        return $this->belongsTo(User::class, 'id');
    }

}

但似乎某些东西没有像我预期的那样工作,如何以正确的方式做到这一点?感谢。

3 个答案:

答案 0 :(得分:5)

您不能使用相同的ID执行此操作,您需要为用户表创建2列owner_id和manager_id然后关联表

    public function owner(){
        return $this->belongsTo('App\User','id','owner_id');
    }

    public function manager(){
        return $this->belongsTo('App\User','id','manager_id');
    }

答案 1 :(得分:0)

您可以在users表上设置一个标志,告诉您哪一个代表团队和经理,比如role,然后使用其他范围方法更新您的关系,例如:

public function user(){
    return $this->belongsTo(User::class, 'id');
}

public function scopeManager(){
    return $this->user()->where('role', 'manager');
}

public function scopeOwner(){
    return $this->user()->where('role', 'owner');
}

这意味着您可以在用户和团队之间设置关系,并根据您所指的用户类型设置过滤器:

$manager = Team::first()->manager()->get();
//same for owner

不确定这是一个非常全面的答案,但我很确定它应该足够了。

任何遗漏都请指出。

答案 2 :(得分:0)

Laravel如何知道谁是所有者以及谁是经理? 您的数据库结构如何?

在当前场景中,owner()和manager()函数将返回相同的结果。

此外,在您当前的设置中,这意味着一个团队只属于一个用户(此外,您说您的外键存储在通常是主键的id列中。)

我认为您需要的是User和Team之间的ManyToMany关系以及存储用户在团队中的角色的中间表。如果用户一次只是一个团队的成员,则用户belongsTo团队和他的角色可以保存在User表的单独字段中。

一些建议:

1)更具体地说明你的问题。 “事情没有按照我的预期发挥作用”并不具体,它无助于我们理解你想做什么以及实际发生了什么

2)阅读Laravel文档。 https://laravel.com/docs/5.5/eloquent-relationships