Laravel Атрибут добавления модели из отношения полиморф c - PullRequest
1 голос
/ 06 апреля 2020

У меня есть модель Course следующим образом:

class Course extends Model {
    protected $table = 'courses';
    protected $primaryKey = 'id';
    public $incrementing = true;
    public $timestamps = false;

    protected $appends = ['locked_by'];

    public function lock(){
        return $this->morphMany('App\Models\Lock', 'asset');
    }

    public function getLockedByAttribute(){
        if($this->lock->count()){
            return $this->lock->shift()->owner_id;
        } else {
            return 0;
        }
    }
}

A Course может иметь много связанных Lock объектов, указывающих, что пользователь хочет заблокировать данные Course для редактирования другими пользователи.

Теперь при получении Course подробностей определенного c курса из Laravel API я получаю следующие данные:

    {
        "id": 1,
        "name": "Linear Algebra 2",
        "abbreviation": "2WF20",
        "status": "draft",
        "owner_id": 2,
        "created_at": "2020-03-10 13:09:15",
        "locked_by": 2,
        "lock": []
    }

в то время как я ожидал:

    {
        "id": 1,
        "name": "Linear Algebra 2",
        "abbreviation": "2WF20",
        "status": "draft",
        "owner_id": 2,
        "created_at": "2020-03-10 13:09:15",
        "locked_by": 2
    }

Как видно из кода, атрибут "locked_by" не берется из таблицы Course, а добавляется переменной $appends в модели. Число после "locked_by" - это идентификатор пользователя, который в данный момент владеет блокировкой на этом Course.

Может кто-нибудь сказать мне, откуда берется атрибут "lock": [] и как от него избавиться? Я заметил, что атрибут "lock": [] отсутствует, если функция getLockedByAttribute() не обращается к $this->lock, однако мне нужна эта ссылка, чтобы получить user_id пользователя, владеющего блокировкой? Я делаю что-то неправильно? Должен ли я использовать другой подход, чтобы получить user_id пользователя, владеющего блокировкой?

1 Ответ

1 голос
/ 06 апреля 2020

Атрибут lock находится в ответе, потому что для получения значения атрибута locked_by модель должна загрузить отношение lock.

Если вы хотите скрыть отношение блокировки Каждый раз, когда вы возвращаете модель Course в виде массива или JSON, вы можете добавить отношение к свойству $hidden в вашей модели Course.

Из документов :

Иногда вы можете с помощью sh ограничить атрибуты, такие как пароли, которые включены в массив вашей модели или представление JSON. Для этого добавьте в модель свойство $ hidden.

При скрытии отношений используйте имя метода отношения.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Course extends Model
{
    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = ['lock'];
}

Если вы хотите скрыть его только в Speci c запрос, вы можете сделать что-то вроде этого:

return App\Courses::with('lock')
    ->get()
    ->makeHidden('lock');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...