gpt4 book ai didi

php - 保存与多列的关系

转载 作者:行者123 更新时间:2023-11-29 07:50:32 26 4
gpt4 key购买 nike

我有一个 Laravel 应用程序,我正在将旧数据库迁移到新数据库。我对表进行了一些更改,添加了一些新表,并删除了一些表。我为此制作了一个迁移脚本。

我有一个用户。该用户被分配到一所学校和一个组。在我的旧数据库中,用户被分配到一所学校和一组。因此,我的用户表中有一个名为“group_id”的列和一个名为“school_id”的列。

现在,我制作了一个映射表(我想这是正确的英文单词),因为用户应该被分配到多个学校和多个组。

用户表:

ID | username | password | more...

学校表:

ID | name | address | more...

组表:

ID | name | alias | more...

group_user table:

ID | group_id | user_id | school_user_id

user_school table:
ID | user_id | school_id

如您所见,我还将 school_user 关系的 ID 添加到映射表中,因为这样可以更轻松地在我的应用程序中使用。如果我从学校中删除用户,我可以使用外键删除 group_user 关系。原因很简单:用户必须分配到一个学校,否则他不能在一个组中。

我用于保存用户的 Laravel Controller 是:

$user = new User;

$user->id = $gebruiker->id;
$user->username = $gebruiker->gebruikersnaam;
$user->password_md5 = $gebruiker->wachtwoord;
$user->firstname = $gebruiker->voornaam;
$user->prefix = $gebruiker->tussenvoegsel;
$user->lastname = $gebruiker->achternaam;
$user->phonenumber = $gebruiker->telefoonnummer;
$user->emailaddress = $gebruiker->email;
$user->gender = ($gebruiker->geslacht == 'man' ? 'male' : 'female');
$user->birthdate = $gebruiker->geboortedatum;

$user->save();

$user->groups()->sync(array('group_id' => $gebruiker->groep_id));
$user->schools()->sync(array($gebruiker->school_id));

我的用户模型有两种方法:

public function schools()
{
return $this->belongsToMany('School');
}

public function groups()
{
return $this->belongsToMany('Group');
}

我可以为学校保存关系。这很容易,因为映射表 school_user 有两列。 Laravel 为我解决了这个问题。但是,在 group_user 表中我有三列

我试图让我的 Controller 保存这样的关系:

 $user->groups()->sync(array('group_id' => $gebruiker->groep_id, 'school_id' => $gebruiker->school_id));

但是,不幸的是,它不起作用。谁能告诉我该怎么办?

编辑:对不起!我没有问正确的问题。我对这篇文章进行了编辑,并将其设为斜体

最佳答案

定义关系时,您需要在数据透视表中指定任何其他列。所以:

public function groups()
{
return $this->belongsToMany('Group')->withPivot(['id','school_user_id']);
}

请参阅文档 here .

<小时/>

更新:

您应该使用attachdetach(而不是sync)将您的用户与群组和学校关联。 sync 将从中间数据透视表中删除不在您传递给它的数组中的任何模型,这意味着在您现有的代码中,$user->schools()->sync(array( $gebruiker->school_id)) 将删除与用户关联的所有其他学校。这将允许用户仅与一所学校关联。如果您要对群组使用同步,则同样适用于群组。

因此,在使用 $user->save() 保存用户后,您将运行:

$user->schools()->attach($gebruiker->school_id);

然后,获取刚刚添加到 school_user 数据透视表中的条目的 ID:

$school_user_id = $user->schools()->wherePivot('school_id', $gebruiker->school_id)->first()->pivot->id;

最后,附加用户和组,并设置 school_user id,以便您可以将其用作外键以允许级联删除:

$user->groups()->attach($gebruiker->groep_id, array('school_user_id' => $school_user_id));
<小时/>

更新 2:事实证明,您可以在保存用户时使用 sync 而不是 attach 来更新数据透视表(事实上,>should),只要将sync的第二个属性设置为false即可。这样做会禁用 sync 的分离行为,因此只会为该用户添加新的 school_user 连接,而不会删除其任何其他学校连接。

$user->schools()->sync([$gebruiker->school_id], false);

这样做的好处是它允许用户连接到多个学校,但可以防止数据透视表中同一 school_user 组合出现重复条目​​。通常,这种完整性检查对于数据透视表来说并不是一个大问题,因为分离会清除所有重复的条目。但是,由于您将在数据透视表和 group_user 表之间建立关系,并依赖于外键的级联删除,因此最好确保数据透视表尽可能保持干净。

关于php - 保存与多列的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26528696/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com