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

Pwn*_*all 3 php mysql database relationship laravel

我是新手一起定义关系和框架,我只是习惯于原始的sql.我的作业(谷歌+ laravel文档),但我想我只是没有正确理解它.

Heres是相关信息:用户表:

Table: Users
id       - int (auto increment)
username - varchar
Run Code Online (Sandbox Code Playgroud)

挑战表:

Table: Challenges
id    - int (auto increment)
name  - varchar
Run Code Online (Sandbox Code Playgroud)

User_challenge_links

Table User_challenge_links
id                          - int (auto increment)
user_id                     - int
challenge_sub_categories_id - int
Run Code Online (Sandbox Code Playgroud)

Challenge_sub_categories

Table Challenge_sub_categories
id                - int (auto increment)
category_id       -
sub_category_id   -
challenge_id      -
Run Code Online (Sandbox Code Playgroud)

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

class User extends Eloquent
{
    protected $table = "users";

    public function challenges() {
        // get user-> challenges
    }
}
Run Code Online (Sandbox Code Playgroud)

关系:

  • 用户有许多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"
Run Code Online (Sandbox Code Playgroud)

类别数据ID名称1"Foo"2"Bar"

Sub_categories数据ID名称1"SubFoo"2"SubBar"

挑战数据ID名称1"Swing dat Foo"2"禁止所有东西"3"Foo The Bars"

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

数据流:
用户可以创建类别或使用现有类别并将挑战链接到它们(现有的或新的).但是,用户也可以选择使用子类别,然后将其链接到类别并将挑战链接到该类别.
因此,类别是必需的,但sub_category不是.但是,如果使用了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
Run Code Online (Sandbox Code Playgroud)

这些是一些可能的情况

lag*_*box 20

这个设置应该让你去.我尽量保持命名尽可能简单.

users
    id
    username

challenge_user
    user_id
    challenge_id

challenges
    id
    name
    topic_id      
    category_id

topics
    id
    name

categories
    id
    name
Run Code Online (Sandbox Code Playgroud)

定义您的雄辩模型

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');
    }
}
Run Code Online (Sandbox Code Playgroud)

使用您的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();
Run Code Online (Sandbox Code Playgroud)

参考文献和建议阅读:

Laravel雄辩的关系 belongsTo belongsToMany hasMany

查询关系 Model::has()

渴望加载 Model::with()

用于访问关系的动态属性解析$model->relationship

插入相关模型 attach() associate()

查询范围

使用数据透视表如果需要从数据透视表中检索额外数据.