Расширение моделей в Laravel Eloquent - PullRequest
3 голосов
/ 06 марта 2020

В моем приложении у меня есть пользователь (Дух)

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);
    }
}

Идея состоит в том, что руководителем группы является пользователь, для которого логическое значение isLeader в сводной таблице team_user установлено в значение true. В моем TeamleaderScope я пробовал что-то вроде

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

, но это кажется неправильным, потому что Teamleader::all() просто возвращает всех пользователей. Я никогда не пытался расширить такую ​​модель, но это должно быть возможно, верно? Может ли кто-нибудь помочь мне в правильном направлении?

1 Ответ

2 голосов
/ 06 марта 2020

для повторного использования общего метода и т. Д. c в двух классах в 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 и использовать все методы, например, в Teamleader.php.
, теперь, если вы хотите, чтобы пользователи были лидерами команд, вы можете попробовать следующее код:

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

надеюсь будет полезен

...