php - 中间表的 Eloquent 模型关系

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

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

抱歉这个业余问题,但总体来说只是习惯 Laravel 和 ORM。

最佳答案

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

关于php - 中间表的 Eloquent 模型关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36850886/

相关文章:

mysql - 列出所有记录并统计它们在 SQL 中的某个日期范围内使用的次数

php - 从购物车中检索和回显 'products' 的简单 PHP 请求不起作用?

php - 为什么这个 MySQL 查询需要永远运行?

laravel - 如何在已编译的 View 文件中执行 javascript(使用 View::render 方法)

php - 自动创建页面

php - 查询结果记录到列中进行比较

php - 从 4 个相同的 Web 服务器中的 1 个运行 Cron 作业,所有这些服务器都具有相同的作业

php - laravel 包不安装照明/支持

php - 在我的脚本完成很久之后,MySQL (RDS) 查询仍在我的进程列表中运行

database - Laravel 加载数据库