В Laravel - добавить переменную в модель, не помещая ее в базу данных - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть Team-модель, которая использовалась в нескольких местах и ​​которая возвращает поля из базы данных в конечной точке API.

В настоящее время к ней обращаются и возвращают так:

$team = Team::find(1)
return $team;

Я хотел бы добавить вычисляемую переменную к возвращенной коллекции.Я предполагал, что смогу добавить его в конструктор Модели и таким образом получить его со всеми местами, где в данный момент используется Team-модель, например:

class Team extends Model
{

    protected $table = 'teams';
    protected $fillable = [
        'id',
        'created_at',
        'updated_at',
        'team_name'
    ];

    public $number_of_players;

    public function __construct( array $attributes = [] ){
        $this->number_of_players = 3; //This number should be calculated
        parent::__construct( $attributes );
    }
}

Но это не работает.Как добавить переменную во все места, где выбирается Team-модель?

Я также изучил Ресурсы API .Похоже, это может быть решением, но я нашел его довольно многословным и длинноволосым (плюс, я тоже не смог заставить его работать).

1 Ответ

2 голосов
/ 23 сентября 2019

Вы можете использовать аксессор / мутатор

Предположим, у вас есть отношения

Команда-> Игрок (Команда имеет много игроков)

Вы можете сделать как

в модели команды

class Model extends Model {
    public function players()
    {
        return $this->hasMany(Player::class, 'team_id', 'id');
    }
}

теперь вы можете сделать это

<?php
class Model extends Model {
    protected $appends = ['number_of_players'];

    public function players()
    {
        return $this->hasMany(Player::class, 'team_id', 'id');
    }

    public function getNumberOfPlayersAttribute()
    {
        return $this->players->count();
    }
}

, а затем получить доступ к количеству игроков команды, например App/Team::find(1)->number_of_players

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...