Laravel:如何使用多个数据透视表关系

Posted

技术标签:

【中文标题】Laravel:如何使用多个数据透视表关系【英文标题】:Laravel: How to use multiple pivot table relationships 【发布时间】:2014-06-13 16:59:07 【问题描述】:

我不熟悉一起定义关系和框架,我只是习惯于原始 SQL。我做了功课(google + Laravel 文档),但我认为我没有正确理解它。

以下是相关信息: 用户表:

Table: Users
id       - int (auto increment)
username - varchar

挑战表:

Table: Challenges
id    - int (auto increment)
name  - varchar

用户挑战链接

Table User_challenge_links
id                          - int (auto increment)
user_id                     - int
challenge_sub_categories_id - int

Challenge_sub_categories

Table Challenge_sub_categories
id                - int (auto increment)
category_id       -
sub_category_id   -
challenge_id      -

所以我的目标.. 用户->挑战。

class User extends Eloquent

    protected $table = "users";

    public function challenges() 
        // get user-> challenges
    

关系:

一个用户有很多 User_challenge_links User_challenge_link 有一个 challenge_sub_categories_id(因此是一个 challenge_sub_category) challenge_sub_categories 中的 challenge_id 匹配挑战表中的挑战

任何帮助,甚至为我指出正确的方向都将不胜感激!

编辑: 示例数据: 用户数据

Users
id    name
1     "Sjaak"
2     "Henk"

类别数据 身份证名称 1“福” 2“酒吧”

子类别数据 身份证名称 1“亚富” 2“子栏”

挑战数据 身份证名称 1 “摇摆 dat Foo” 2“禁止一切” 3“Foo酒吧”

Challenge_sub_categories 数据

id   category_id    sub_category_id    challenge_id
1    1              1                  1
2    2              1                  1
3    1              2                  2
4    2              1                  3
5    2              2                  2

用户挑战链接数据

id     user_id      Challenge_sub_categories_id
1      1            1
2      1            3
3      2            2
4      2            3
5      2            4

数据流: 用户可以创建类别或使用现有类别并将挑战链接到它们(现有的或新的)。但是,用户也可以选择使用子类别,然后将其链接到一个类别并将挑战链接到该类别。 因此,类别是强制性的,但 sub_category 不是。但是,如果使用子类别(再次......现有或新的),挑战将连接到该子类别。

注意:一个子类别可以连接多个类别

category - House
    sub_category - Cleaning
         Challenge - getting special soap

category - Car
    sub_category - Cleaning
        Challenge - getting special soap

category - Showering
    Challenge - getting special soap

这些是一些可能的情况

【问题讨论】:

user 与表架构中的 challenge 有什么关系?你有user_idchallenge_sub_categories_id 这是不正确的,对吧? 我们是否缺少类别表? 这个 Challenge_sub_categories 是打算成为挑战的子类型......还是挑战属于一个类别并且该类别可能有一个父类别? 一个挑战总是链接到一个类别和一个可选的子类别,但是一个挑战可以链接到许多类别和子类别,因此之间的链接表,我们需要知道那个挑战的特定实例用户拥有。类别和子类别表主要由 - int (auto increment) - varchar - varchar 组成 你所说的挑战实例是什么意思?
【参考方案1】:

这个设置应该能让你继续前进。我试图让命名尽可能简单。

users
    id
    username

challenge_user
    user_id
    challenge_id

challenges
    id
    name
    topic_id      
    category_id

topics
    id
    name

categories
    id
    name

定义你的 Eloquent 模型

class User extends Eloquent 
    public function challenges() 
        return $this->belongsToMany('Challenge');
    


class Challenge extends Eloquent 
    public function users() 
        return $this->belongsToMany('User');
    
    public function topic() 
        return $this->belongsTo('Topic');
    
    public function category() 
        return $this->belongsTo('Category');
    


class Topic extends Eloquent 
    public function challenges() 
        return $this->hasMany('Challenge');
    


class Category extends Eloquent 
    public function challenges() 
        return $this->hasMany('Challenge');
    

使用您的 Eloquent 模型......只是您可以做的一些示例。

// Collection of all Challenges by Topic name
Topic::with('challenges')->whereName($topic_name)->first()->challenges;

// Collection of all Challenges by Category name
Category::with('challenges')->whereName($category_name)->first()->challenges;

// Collection of all Users by Challenge id
Challenge::with('users')->find($challenge_id)->users;

// Collection of Users with atleast 2 Challenges
User::has('challenges', '>', 1)->get();

// Attach Challenge to User
$user = User::find($id);
$user->challenges()->attach($challenge_id);

// Assign a Topic to a Challenge
$challenge = Challenge::find($challenge_id);
$topic     = Topic::find($topic_id);

$challenge->topic()->associate($topic);
$challenge->save();

参考和建议阅读:

Laravel Eloquent RelationshipsbelongsTobelongsToManyhasMany

Querying relationsModel::has()

Eager LoadingModel::with()

Dynamic Properties for Accessing Relations解决$model->relationship

Inserting related Modelsattach()associate()

Query Scopes

Working with Pivot tables如果您需要从数据透视表中检索额外数据。

【讨论】:

非常感谢您抽出时间 m8!仍然有一些挑战需要解决,但这有助于我按照我想要的方式设置所有内容,并了解如何处理 laravel 关系! 如何获取特定类别的用户集合?

以上是关于Laravel:如何使用多个数据透视表关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 与数据透视表的关系,关系?

Laravel 在数据透视表中为克隆字段的一个关系 ID 插入多行

laravel 使用具有多对多关系数据透视表的策略

如何在 laravel 中使用数据透视表中的 3 个关系创建关系?

数据透视表的laravel关系问题

Laravel 如何创建数据透视表?