【问题标题】:Eloquent model relationship for intermediate table中间表的 Eloquent 模型关系
【发布时间】:2016-08-19 10:52:06
【问题描述】:

考虑下面的表结构:

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 表定义了可用的语言和区域组合,然后我们可以将每个用户链接到一个有效的组合。

我已经多次阅读 Laravel 文档以寻找正确的关系类型,但似乎多对多和多通过关系很接近,但由于我们的 user.id 没有在中间表中使用,所以我可能不走运。

很抱歉这个业余问题,但只是习惯了 Laravel 和 ORM。

【问题讨论】:

  • 您应该使用数据透视表。然后 Eloquent 效果很好
  • 这是我最初的想法,但看起来 Eloquent 与数据透视表的关系依赖于数据透视表中存在的 id 以及在该表上旋转的表。 lang_region 表是我的数据透视表,因为它包含 lang_id 和 region_id,但我要解决的问题是我的用户表只有一个 lang_region 行的外键,我希望通过 lang_region 访问给定的 lang用户。
  • 您确定您的数据库结构是经过深思熟虑的吗?解释一下为什么lang_region表是part,需要引用?
  • lang_region 表决定了可用的本地化组合。允许我将 US-EN 和 CA-FR 指定为有效组合,但不能指定 US-FR。然后在用户表中引用来自这些有效组合的 ID。

标签: php mysql laravel eloquent


【解决方案1】:

如果我正确理解你想要什么:

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

【讨论】:

    【解决方案2】:

    我会将 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');
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-10-20
      • 2019-09-20
      • 2015-10-29
      • 2016-02-26
      • 2014-11-22
      • 2016-02-06
      • 1970-01-01
      • 2021-10-01
      • 2021-07-04
      相关资源
      最近更新 更多