当前位置: 首页 > 面试题库 >

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

喻元龙
2023-03-14
问题内容

我是一起定义关系和框架的新手,我只是习惯于原始SQL。我做了家庭作业(google + Laravel文档),但是我认为我不太了解它。

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

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

挑战表:

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

User_challenge_links

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与Challenges表中的一个挑战匹配

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

编辑: html" target="_blank">示例数据:用户数据

Users
id    name
1     "Sjaak"
2     "Henk"

类别数据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

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

数据流:
用户可以创建类别或使用现有类别,并将挑战链接到它们(现有或新的)。但是,用户也可以选择使用子类别,然后他将其链接到一个类别并将挑战链接到该类别。
因此,类别是强制性的,而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

这些是一些可能的情况


问题答案:

此设置应该可以帮助您。我试图使命名尽可能简单。

users
    id
    username

challenge_user
    user_id
    challenge_id

challenges
    id
    name
    topic_id      
    category_id

topics
    id
    name

categories
    id
    name

定义口才模型

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

使用您的口才模型…只是您可以做的一些事例。

// 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雄辩的关系 belongsTo
belongsToMany hasMany

查询关系 Model::has()

渴望加载 Model::with()

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

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

查询范围

使用数据透视表如果需要从数据透视表中检索其他数据。



 类似资料:
  • 我对定义关系和框架都是新手,我只是习惯了原始SQL。我做了家庭作业(google Laravel文档),但我想我只是没有正确理解它。 以下是相关信息:用户表: 挑战表: 用户挑战链接 Challenge_sub_categories 所以我的目标...用户- 这些关系: 一个用户有很多User_challenge_links User_challenge_link有challenge_sub_ca

  • 我正在创建一个应用程序,其中用户可以被分配到多个组织,组织可以有多个用户--多对多的关系。 我希望能够这样做:以及 我有表... 我有表... 呃!用户-组织,组织-用户! 和我有数据透视/映射/等。表 表有一个字段和一个字段。 Elecoquent假设并期望-但这不是我为表命名的,也不想重命名。 我设置了以下内容 用户: 然后我测试一下: 并得到以下错误: SQLState[42S02]:找不到

  • 如果我尝试以下操作,则页面正在加载: 有以下表格:-用户-user_department-部门 数据透视表用户\u部门有两个外键:-部门\u id-用户\u id 在我的用户模型中: 在我的部门模型中: 顺便说一下:以下代码正在工作: 但是我无法在不破坏我的页面的情况下获得用户的部门。 有什么想法吗?

  • 事实上,我的问题很简单,但我找不到任何答案。 我使用的是Laravel Elotent,我有3张桌子: 一个数据透视表叫做: 我已经从我的公司对象中获得了,我正在尝试获取

  • 我有一个用户表和一个帐户表。 此帐户表定义用户可以拥有的帐户。 例如 账户: 用户: 我现在有另一个表:users\u accounts 我正在为新用户创建一个界面。在这个页面上,我有基本的细节,但也有一个复选框列表(从accounts表创建)。复选框表示用户需要为其设置的帐户。 我要做的是创建帐户时: 我还想将用户ID和他们需要设置的帐户添加到users_accounts表中。单个用户可能需要多

  • 我添加数据的表单如下所示: 当klik保存时,它将调用控制器 我的控制器是这样的: 我的服务是这样的: 我的模型用户是这样的: 所以我有3个表:users表、users\u banks表(pivot表)和master\u datas表 类型为bank的主数据表中的银行名称列表 Users表具有字段id、名称、电子邮件、密码等= Master_datas表有字段id(这是银行id)、名称(这是银行名