Как создать аксессор только для сводной таблицы polymorphi c? - PullRequest
0 голосов
/ 15 марта 2020

Я новичок в laravel. В настоящее время у меня есть несколько моделей, которые имеют полиморфные отношения c многие ко многим через laravel. вот структура:

sections
  id
  name

handbooks
  id
  name

properties
  id
  name
  type(list, number, string, file)

property_bindings
  id
  model_id
  model_type (handbook or section)
  property_id

elements (through the section gets properties to fill)
  id
  name
  section_id

property_value
  id
  model_id
  model_type (element or another model )
  property_id
  value (for properties of the file type I store the record id from the table files)
class Section extends Model
{
    public function properties()
    {
        return $this->morphToMany('App\Property', 'model', 'property_bindings')->withTimestamps()->orderBy('sort');
    }

    public function elements() {
        return $this->hasMany('App\Element');
    }
}

class Element extends Model
{

    public function propertyValues()
    {
        return $this->morphToMany('App\Property', 'model', 'property_values')->withPivot('id','value')->withTimestamps();

    }

    public function section() {
        return $this->belongsTo('App\Section');
    }
}

Теперь у меня нет проблем с получением и изменением данных в таблицах. Но при выводе записей из таблицы 'elements' мне нужно преобразовать значения ее свойств, я попытался сделать это через модель свойств

class Property extends Model
{
public function getValueAttribute($value) {
        if (empty($this->pivot)) return null;

        $id = $this->pivot->id;
        $value = $displayValue = $this->pivot->value;

        if($this->isTypeFile()) {
            $file = File::find($value);
            if($file) {
                $displayValue = File::getUrlFile($file);
            }
        }

        if($this->isTypeNumber()) {
            $displayValue = (int)$value;
        }

        if ($this->isTypeList()) {
            $displayValue = PropertyEnum::find($value)['value'];
        }

        return [
            'id' => $id,
            'original' => $value,
            'display' => $displayValue
        ];
    }
}

Для элементов это работает хорошо, но значения также начинаются для поиска разделов.

$element->propertyValues печатает массив [{"id":1,"name":"width","value":{"id":24,"original":"20","display":"20"}...

$section->properties печатает массив [{"id":1,"name":"width","value":{"id":null,"original":"null","display":"null"}...

Что делать, чтобы разделы выполняли нет методов доступа, но есть модели, которые связываются через таблицу property_values?

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