gpt4 book ai didi

php - Laravel 数据透视表上的访问器(Getter)和修改器(Setter)

转载 作者:可可西里 更新时间:2023-10-31 23:11:38 26 4
gpt4 key购买 nike

我有一个将用户连接到工作区的数据透视表。在数据透视表上,我还有一个角色列,它定义了该工作区的用户角色。我可以为数据透视表中的角色提供访问器 (Getter) 和修改器 (Setter) 方法吗?我一直在努力查看所有内容,但 Eloquent 中有关数据透视表的详细信息非常少。

我不确定是否必须设置自定义枢轴模型?如果我这样做,一个例子会很棒,因为关于枢轴模型的文档非常基础。

谢谢。

最佳答案

如果您需要做的只是访问数据透视表上的其他字段,您只需在关系定义上使用 withPivot() 方法:

class User extends Model {
public function workspaces() {
return $this->belongsToMany('App\Models\Workspace')->withPivot('role');
}
}

class Workspace extends Model {
public function users() {
return $this->belongsToMany('App\Models\User')->withPivot('role');
}
}

现在您的角色字段将在数据透视表中可用:

$user = User::first();

// get data
foreach($user->workspaces as $workspace) {
var_dump($workspace->pivot->role);
}

// set data
$workspaceId = $user->workspaces->first()->id;
$user->workspaces()->updateExistingPivot($workspaceId, ['role' => 'new role value']);

如果您确实需要为您的数据透视表创建访问器/修改器,您将需要创建一个自定义数据透视表类。我以前没有这样做过,所以我不知道这是否真的有效,但看起来你会这样做:

创建一个包含访问器/修改器的新枢轴类。此类应扩展默认的 Pivot 类。这个新类是将在用户或工作区创建 Pivot 模型实例时实例化的类。

namespace App\Models;
use Illuminate\Database\Eloquent\Relations\Pivot;
class UserWorkspacePivot extends Pivot {
getRoleAttribute() {
...
}
setRoleAttribute() {
...
}
}

现在,更新您的用户和工作区模型以创建这个新的数据透视表类,而不是默认的。这是通过覆盖 Model 类提供的 newPivot() 方法来完成的。您想要覆盖此方法,以便创建新 UserWorkspacePivot 类的实例,而不是默认的 Pivot 类。

class User extends Model {
// normal many-to-many relationship to workspaces
public function workspaces() {
// don't forget to add in additional fields using withPivot()
return $this->belongsToMany('App\Models\Workspace')->withPivot('role');
}

// method override to instantiate custom pivot class
public function newPivot(Model $parent, array $attributes, $table, $exists) {
return new UserWorkspacePivot($parent, $attributes, $table, $exists);
}
}

class Workspace extends Model {
// normal many-to-many relationship to users
public function users() {
// don't forget to add in additional fields using withPivot()
return $this->belongsToMany('App\Models\User')->withPivot('role');
}

// method override to instantiate custom pivot class
public function newPivot(Model $parent, array $attributes, $table, $exists) {
return new UserWorkspacePivot($parent, $attributes, $table, $exists);
}
}

关于php - Laravel 数据透视表上的访问器(Getter)和修改器(Setter),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28921787/

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