Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 12.09.2019 10:46:19

Polymorphic Relationships

Хотелось бы узнать, смогу ли я реализовать следующее:

Есть следующие сущности: оборудование, расходники и ячейки. Оборудование и расходники могут лежать в ячейках.
Для оборудования в безе создается запись для каждой единицы оборудования, а для расходников в базе фиксируется только название расходника, некое описание (например Ч/Б картридж ABC123 для принтера SUPERPRINTER-123), а количество данного расходника не фиксируется. Т.е. данного расходника физически может быть 5 штук и каждый из этих пяти может лежать в отдельной ячейке.
Т.о. получается:

- в ячейке может лежать как единица оборудования, так и расходник (Morph Relation)
- одна единица оборудования (одна запись в БД) может лежать только в одной ячейке (один к одному)
- одна единица расходника (одна запись в БД) может лежать в нескольких ячейках (один ко многим)

Сразу вопрос: это реалезуемо в Laravel? Т.е. полиморфные связи и одновременно один ко одному и один ко многим.

Структура таблиц

Cells
   id
   name
   content_type
   content_id

Equipment
   id
   name

Suplies
   id
   name

Модели

class Cell extends Model {
   public function content()
    {
        return $this->morphTo();
    }
}

class Equipment extends Model {
   public function cell()
    {
        return $this->morphOne('App\Cell', 'content');
    }
}

class Suply extends Model {
   public function cell()
    {
        return $this->morphMany('App\Cell', 'content');
    }
}

Вопрос 2

Ячейка может быть пустая. Т.е. поля content_type и content_id могут быть пустыми
Как мне удалить связь из ячейки (очистить поля выше), не удаляя при этом ячейку?

Т.е сохранить могу:

$equipment = Equipment::find($equipment_id);
$cell = Cell::find($cell_id);
$equipment->cell()->save($cell);

А вот как очистить ячейку?

Изменено netman2002 (12.09.2019 10:56:32)

Не в сети

#2 12.09.2019 12:04:19

Re: Polymorphic Relationships

Сразу вопрос: это реалезуемо в Laravel?

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

Т.е. полиморфные связи и одновременно один ко одному и один ко многим.

По-моему это чушь. Надо переосмыслить какие реально нужны связи.
Мне кажется ты упустил такой момент, что есть наименование (или тип) товара и есть единица хранения товара - штука, упаковка и т.п. Единиц одного наименования может быть много и они могут быть разложены по ячейкам. Не наименование товара раскладывается, а экземпляр.

Видимо, отношение экземпляра к ячейке один-к-одному. Возможно полиморфиный, я не уверен. Я бы пытался сделать просто с минимальным набором сущностей, и только когда не получается просто, тогда усложнять.

Наименование товара к экземплярам товара относится как один-ко-многим.

Тип расходник/оборудование можно описать булевым или enum полем в таблице наименований. Свойства товара разместить в одной "широкой" таблице с nullable полями на все случаи жизни. Я не вижу здесь жёсткого требования заводить по отдельной таблице на каждую разновидность товара. Можно да, но можно и нет. big_smile

Не в сети

#3 13.09.2019 12:07:52

Re: Polymorphic Relationships

Спасибо за ответ.

А кто-нибудь знает, как ответить на второй вопрос?
Как удалить связь в таблице Cells не удаляя ячейки и единицы оборудования?

Всё, разобрался...

$equipment = Equipment::find($equipment_id);
$cell = Cell::find($cell_id);

$cell->content()->associate( $equipment );
$cell->save();

или

$cell->content()->dissociate();
$cell->save();

Изменено netman2002 (13.09.2019 13:03:40)

Не в сети

Подвал раздела