laravel - 当数据透视表具有唯一字段时更新 Laravel 数据透视表
问题描述
我有两个模型,用户和服务,具有多对多关系。数据透视表有两个附加字段,id_code
和alias
。User 和 Service 之间可能有很多关系,但每一个都由 field 唯一标识id_code
。我需要通过 检索数据透视表中的特定记录id_code
,并仅更新该alias
记录的 。
我的模型:
用户:
class User extends Authenticatable
{
//All attributes & other functions here...
public function linked_services(){
return $this->belongsToMany(Service::class)
->withPivot('alias', 'id_code')
->withTimestamps();
}
}
服务:
class Service extends Model
{
//All attributes & other functions here...
public function linked_users(){
return $this->belongsToMany(User::class)
->withPivot('alias', 'id_code')
->withTimestamps();
}
}
服务-用户迁移:
Schema::create('service_user', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id')->nullable();
$table->unsignedBigInteger('service_id');
$table->string('alias', 50)->nullable();
$table->string('id_code', 50);
$table->foreign('user_id')->references('id')->on('users');
$table->foreign('service_id')->references('id')->on('services');
$table->timestamps();
});
在更新函数中,我从视图中获取了特定的 $id_code,但我不知道如何更新该特定“id_code”的“别名”。
我已经尝试过但不起作用的方法:
public function update(Request $request, String $id_code){
foreach(Auth::user()->linked_services as $service){
if($service->pivot->id_code === $id_code){
$service->pivot->alias = $request->alias;
$service->pivot->save();
}
}
return redirect()->route('services_user.index');
}
此函数更新 service_user 的所有现有数据透视记录,我只需要更新给定“id_code”的特定记录。
解决方案
我解决了!!!我告诉你怎么做:
Auth::user()->linked_services()
->wherePivot('id_code', $id_code)
->update(['alias' => $request->alias]);
我了解到$user->linked_services()
(与 不同$user->linked_services
)返回一个关系对象(在本例中为belongsToMany
),其中包含所有关系数据(中间表、枢轴、FK、父/相关对象等),并且可以在该对象上使用->wherePivot()
.
推荐阅读
- symfony - 我无法从 JWT 获取用户
- python - 我如何在 python 中使用 asyncio 接收请求的大小
- python - 除了在 pyspark 中使用 rand(seed=) 之外,还有其他方法可以生成具有种子值的随机数吗?
- apache-spark - 如果从多个 MapR 位置读取数据,spark shuffle 如何工作?
- javascript - Javascript 弹出,焦点在关闭后不再打开
- django - 为什么帖子不显示在主页上?
- react-native - 无法连接到 GraphQL API 服务器
- azure - 为什么在收到 HTTP 请求时逻辑应用计划不工作?
- c++ - Visual Studio 无法识别标准库
- objective-c - 从完成块开始动画后,模态 NSSavePanel 消失