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

标签 php mysql database laravel relationship

我不熟悉一起定义关系和框架,我只是习惯了原始 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

挑战_子_类别

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)
  • 来自 challenges_sub_categories 的 challenge_id 匹配挑战表中的挑战

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

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

Users
id    name
1     "Sjaak"
2     "Henk"

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

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

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

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

User_challenge_links 数据

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

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

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

category - House
    sub_category - Cleaning
         Challenge - getting special soap

category - Car
    sub_category - Cleaning
        Challenge - getting special soap

category - Showering
    Challenge - getting special soap

这些是一些可能的情况

最佳答案

此设置应该可以让您继续。我尽量使命名尽可能简单。

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 Relationships belongsTo belongsToMany hasMany

Querying relations 模型::有()

Eager Loading 模型::with()

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

Inserting related Models attach() 关联()

Query Scopes

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

关于php - Laravel:如何使用多个数据透视表关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23336145/

相关文章:

javascript - 使用 Codeigniter 在模态中使用 jquery 显示图像

javascript - 用动画计算数字

php - Laravel 5 三个模型的关系

java - 让SQLite删除表中的所有记录

sql - 将数据从一个数据库复制到另一个 SQL 代码

java - 具有数千万用户的现实社交网络模型。我应该使用哪些技术?

php - PHP 中的 JSON 和回调

php - 无论如何要使用 OCI 在 PHP 中预览准备好的 SQL 语句?

mysql - 帮助选择不同

mysql - pgloader:堆耗尽,游戏结束。问题