Многие MorphTo из одной таблицы, используя один и тот же столбец для morph_type - PullRequest
0 голосов
/ 13 февраля 2020

Я хотел написать что-то, что позволит мне отмечать похожие объекты того же класса. Для этого я использовал одну таблицу:

Similar
 - id
 - object_id
 - similar_id
 - similar_type
 - timestamps

Similar_id - это объект, который похож на object_id.

Мой класс Similar имеет два отношения морфа:

    class Similar extends Model
    {
        use SoftDeletes;
        protected $dates = ['deleted_at'];

        public function similar()
        {
            return $this->morphTo();
        }
        public function object()
        {
            return $this->morphTo();
        }
    }

Теперь класс, который может иметь сходство с отношениями.

    class Example extends Model
    {
        public function similar()
        {
          return $this->morphMany(Similar::class, 'similar','similar_type', 'similar_id');
        }
        public function object()
        {
          return $this->morphMany(Similar::class, 'object', 'similar_type', 'object_id');
        }
    }

Когда я вызываю $similar->similar ($similar instanceof Similar), я получаю связанный объект правильного класса, однако, когда я использую $similar->object, я получаю ошибку

Column not found: 1054 Unknown column 'similars.' in 'where clause' (SQL: select * from `similars` where `similars`.`` = 17 and `similars`.`deleted_at` is null limit 1)

Также, когда я пытаюсь отладить отношение $ Similar-> object () с помощью dd (), я вижу, что: #morphType: "object_type" есть ли способ перезаписать его на Similar_type? Может быть, дело в этом?

РЕДАКТИРОВАТЬ: Когда я добавляю object_type в аналогичную таблицу и изменяю object() сопоставление отношений в классе Example, он работает как задумано, но есть ли способ сохранить это один столбец? Я спрашиваю из-за соображений производительности и ненужной избыточности.

Я хотел бы использовать один столбец с типом для обоих отношений Morph.

Буду признателен за любую помощь.

Если название поста неуместно, измените его.

...