【发布时间】:2022-01-24 21:24:40
【问题描述】:
我最近在概念上遇到了一些障碍。
我有一个名为“Clients”的表,其中客户有数字经理(digitalManagers、belongsToMany、Users 表到中间表)和常规经理(managers、belongsToMany、Users 表到中间表)。
客户表的关系摘录:
/**
* Get the assigned users (managers) to this client
* @return BelongsToMany
*/
public function managers(): BelongsToMany
{
return $this->belongsToMany(
User::class,
ClientAssignment::class,
'client_id',
'user_id'
);
}
/**
* Get the assigned digital managers for this client
* @return BelongsToMany
*/
public function digitalManagers(): BelongsToMany
{
return $this->belongsToMany(
User::class,
'digital_managers',
'client_id',
'user_id'
);
}
因此我可以通过Client::findOrFail(1)->digitalManagers()->get()轻松查询数字经理
最近,当名为 digital_merge_with_global 的设置为 true 时,我想添加功能以将常规经理与客户的数字经理合并。我想“动态地”执行此操作(我有我的理由),而不是每次添加/删除常规经理时都更新 digitalManagers->users 中间表。
我可以通过以下代码完成这个逻辑:
$client = $client->load('digitalManagers:id,first_name,last_name,email,avatar', 'managers:id,first_name,last_name,email,avatar');
$definedDigitalManagers = $allManagers = $client->digitalManagers;
if ($client->settings->get('digital_merge_with_global') == true) {
$regularManagersToAdd = $client->managers;
foreach ($regularManagersToAdd as $manager) {
if (!$definedDigitalManagers->contains('id', $manager->id)) {
$allManagers->add($manager);
}
}
}
但我想知道是否有一种方法可以将其定义为一种关系(封装相同的逻辑但作为某种类型的关系)来代替上述public function digitalManagers(),或者我是否只是要求太多Laravel 的。 我查看了docs,但有些概念有点超出我的想象。
理想情况下,我想运行 Client::findOrFail(1)->digitalManagers()->get() 并获取之前代码 sn-p 的输出。
【问题讨论】:
标签: php mysql laravel relationship laravel-8