代码之家  ›  专栏  ›  技术社区  ›  Alex

拉维尔建立动态关系

  •  0
  • Alex  · 技术社区  · 4 年前

    我最近在概念上遇到了一些障碍。

    我有一个名为“客户”的表,其中客户有数字经理(数字经理、归属者、用户表到中间表)和常规经理(经理、归属者、用户表到中间表)。

    客户关系表摘录:

    /**
     * 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 这是真的。我想“动态地”(我有自己的理由)这样做,而不是更新DigitalManager->每次添加/删除常规经理时,用户都会使用中间表。

    我可以通过以下代码实现这一逻辑:

    $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() 或者如果我只是对拉威尔要求太多。 我已经看过了 docs 但有些概念有点让我摸不着头脑。

    理想情况下我想跑步 客户端::findOrFail(1)->;Digital Manager()->得到() 并获取上一个代码片段的输出。

    0 回复  |  直到 4 年前
        1
  •  0
  •   Sevan    4 年前

    我不知道你有多严格 Client::findOrFail(1)->digitalManagers()->get() extending collections 在我看来可以解决你的问题。据此,该判决将改为 Client::findOrFail(1)->get()->withAllManagers() 。您将能够在自己创建的宏中实现代码段的逻辑。

    下面的代码片段显示了应该在服务提供商中定义的宏的定义。

    use Illuminate\Support\Collection;
    
    Collection::macro('withAllManagers', function () {
        foreach ($this as $client) {
            $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);
                    }
                }
            }
    
            $client->allManagers = $allManagers;
        }
    
        return $this;
    });
    

    添加宏后,您将使用它作为 客户端::findOrFail(1)->;获取()->withAllManagers() .我认为它将解决您的问题,即使它可能不会在查询级别生成。

    推荐文章