中间表的雄辩模型关系

时间:2016-04-25 20:55:05

标签: php mysql laravel eloquent

考虑以下表格结构:

user table
id
name
lang_region_id

lang_region table
id
lang_id
region_id

lang table
id
name

region table
id
name

Laravel框架相当新,但尝试将Eloquent模型和关系设置为现有数据库。我想建立我的用户模型与lang和region模型之间的关系。 lang_region表定义了可用的语言和区域组合,然后我们可以将每个用户链接到有效组合。

我已经多次阅读Laravel文档,寻找正确的关系类型,但似乎是Many to Many和Has Many Through关系很接近,但由于我们的user.id未在中间表中使用可能不走运。

对不起业余的问题,但只是习惯了Laravel和ORMs。

2 个答案:

答案 0 :(得分:0)

我会将lang_region表用作数据透视表和具有自己模型的常规表。

class LangRegion extends model
{
    protected $table = 'lang_region';

    public function language()
    {
        return $this->belongsTo(Language::class, 'lang_id');
    }

    public function region()
    {
        return $this->belongsTo(Region::class);
    }

    public function users()
    {
        return $this->hasMany(User::class);
    }
}

class User extends model
{
    protected $table = 'user';

    public function langRegion()
    {
        return $this->belongsTo(LangRegion::class);
    }
}

class Language extends model
{
    protected $table = 'lang';

    public function regions()
    {
        $this->belongsToMany(Region::class, 'lang_region', 'lang_id', 'region_id');
    }

    public function users()
    {
        $this->hasManyThrough(User::class, LangRegion::class, 'lang_id', 'lang_region_id');
    }
}


class Region extends model
{
    protected $table = 'region';

    public function languages()
    {
        $this->belongsToMany(Language::class, 'lang_region', 'region_id', 'lang_id');
    }

    public function users()
    {
        $this->hasManyThrough(User::class, LangRegion::class, 'region_id', 'lang_region_id');
    }
}

答案 1 :(得分:0)

如果我理解你想要的东西:

class User extends Model {
   private function lang_region() {
       return $this->hasOne(LangRegion::class)
   }

   public function lang() {
       return $this->lang_region()->lang();
   }

   public function region() {
       return $this->lang_region()->region();
   }
}

class LangRegion extends Model {
   public function lang() {
       return $this->belongsTo(Lang::class);
   }

   public function region() {
       return $this->belongsTo(Region::class);
   }
}