【问题标题】:Extending models in Laravel Eloquent在 Laravel Eloquent 中扩展模型
【发布时间】:2020-06-19 13:43:43
【问题描述】:

在我的应用程序中,我有一个用户 (duh)

class User {

    public function teams()
    {
        return $this->belongsToMany(Team::class, 'team_user', 'user_id')->wherePivot('confirmed', '!=', null);
    }
}

我正在尝试制作一个扩展User 的模型,就像这样

class Teamleader extends User
{
    protected $table = 'users';

    public static function boot()
    {
        parent::boot();

        static::addGlobalScope(new TeamleaderScope);
    }
}

这个想法是,团队负责人是在team_user 数据透视表中将isLeader 布尔值设置为true 的用户。在我的TeamleaderScope 我已经 尝试过类似

class TeamleaderScope implements Scope
{
    public function apply(Builder $builder, Model $model)
    {
        $model->teams()->wherePivot('isLeader', true);
    }
}

但这似乎是错误的,因为Teamleader::all() 只是返回所有用户。我从来没有尝试过扩展这样的模型,但它应该是可能的,对吧?任何人都可以帮助我朝着正确的方向前进吗?

【问题讨论】:

  • Ramin 在下面提供了符合 OOP 优先组合优于继承原则的指导,这是一个好主意。我已经使用继承和特征走上了这条路,只是想提供一个意见,它经常比它的价值更麻烦。我发现模型继承有用的一种情况是连接到在同一个表中有多个非常不同的实体的遗留数据库,但这里的情况看起来不像。
  • 也许在你的作用域的apply()方法中试试这个:$builder->whereHas('team_user', function ($query) { $query->wherePivot('isLeader', true); });

标签: php laravel eloquent relationship


【解决方案1】:

为了复用PHP中两个类中的常用方法等,可以使用trait。 在您的情况下,在其余模型旁边创建一个 php 文件,我将其命名为 CommonTrait.php,其中必须如下所示:

<?php

namespace App;


trait CommonTrait
{
    public function commonMethodOne()
    {
        // anything
    }

    public function commonMethodTwo()
    {
        // anything
    }

    // for get leaders.
    public function scopeLeaders()
    {
        return $this->teams()->wherePivot('isLeader', true);
    }

    public function scopeSearchLeaders($query, $keyword)
    {
         return $query->where('name', $keyword)->wherePivot('isLeader', true);
    }


}

所以现在你可以在任何你想要的地方使用trait。

例如在User.php中使用它:

<?php

namespace App;

class User
{
    use CommonTrait;
}

所以,现在CommonTrait.php 中的所有方法或变量都可以在User.php 中访问,并且您可以使用User.php 中的那些,您可以在Teamleader.php 中使用它并在@987654331 中使用它的所有方法@.
例如,现在如果你想获得团队负责人的用户,你可以试试下面的代码:

$leaders = User::Leaders();
$resultSearch = User::SearchLeaders("Gard Mikael");

希望对你有用

【讨论】:

  • 感谢您的回复。我想我可以使用特征。但不应该有某种限制。如果 Teamleader 只是一个引用同一个 users 表的模型,我仍然可以说 Teameleader::find(1),即使 id 为 1 的用户不一定是 teamleader。我不确定在哪种情况下这会成为问题,但如果逻辑正确的话,Teamleaders 将只是用户的一个子集,对吧?无论如何,谢谢
  • @GardMikaelFjeldavli 对,我编辑了我的答案,您可以定义与团队领导相关的范围,并使用User:: 使用这些方法
猜你喜欢
  • 2015-03-25
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2016-07-19
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多