Модель с несколькими полиморфными полями

Мне нужно добавить функцию в мою систему, это система управления запасами.

Добавляемая функция о возможности запуска чатов в разных моделях. У меня есть Продукты, Продавцы, Коллекции Продуктов и много других объектов, и мне нужно начать с ними общение.

Поэтому я подумал о создании таблицы с тремя полиморфными полями, чтобы ее можно было многократно использовать в любых вариантах. Это поля

sender_id
sender_type

topic_id
topic_type

receiver_id
receiver_type

И соответствующие поля, чтобы сделать разговор возможным (сообщение, in_reply_of и т. Д …)

Отправитель и получатель должны быть полиморфными, потому что между SystemUsers и Customer может происходить диалог.

Я на правильном пути? Будет ли это работать таким образом? Также я не знаю, как я могу сохранить объекты чата.

1

Решение

Если вы хотите установить чат для нескольких отправителей, получателей и тем, я считаю, что это хорошее отношение.

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

Ниже описано, как вы можете добиться цели!

Установка отношений

Установите отношения следующим образом

class Chat
{
public function sender()
{
return $this->morphTo();
}

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

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

class SystemUser
{
public function sentChats()
{
return $this->morphMany('App\Chat', 'sender');
}

public function receivedChats()
{
return $this->morphMany('App\Chat', 'receiver');
}
}

class Customer
{
public function sentChats()
{
return $this->morphMany('App\Chat', 'sender');
}

public function receivedChats()
{
return $this->morphMany('App\Chat', 'receiver');
}
}

class Illustrate
{
public function illustrable()
{
return $this->morphTo();
}

public function chats()
{
return $this->morphMany('App\Chat', 'topic');
}
}

Создание чата

Как создать чат

public function create()
{
$inputs = request()->only([
'sender_id', 'sender_type', 'receiver_id', 'receiver_type', 'topic_id', 'topic_type',
'message', 'in_reply_of',
]);

$sender = $this->getSender($inputs);
$receiver = $this->getReceiver($inputs);
$topic = $this->getTopic($inputs);

if($sender && $receiver && $topic) {
$chat = $sender->sentChats()->create([
'receiver_id' => $receiver->id,
'receiver_type' => get_class($receiver),
'topic_id' => $topic->id,
'topic_type' => get_class($topic),
'message' => $inputs['message'],
'in_reply_of' => $inputs['in_reply_of'],
]);
}
}

private function getSender($inputs)
{
if(isset($inputs['sender_type'], $inputs['sender_id']) && is_numeric($inputs['sender_id'])) {
switch($inputs['sender_type']) {
case 'SystemUser':
return SystemUser::find($inputs['sender_id']);
case 'Customer':
return Customer::find($inputs['sender_id']);
default:
return null;
}
}
}

private function getReceiver($inputs)
{
if(isset($inputs['receiver_type'], $inputs['receiver_id']) && is_numeric($inputs['receiver_id'])) {
switch($inputs['receiver_type']) {
case 'SystemUser':
return SystemUser::find($inputs['receiver_id']);
case 'Customer':
return Customer::find($inputs['receiver_id']);
default:
return null;
}
}
}

private function getTopic($inputs)
{
if(isset($inputs['topic_type'], $inputs['topic_id']) && is_numeric($inputs['topic_id'])) {
switch($inputs['topic_type']) {
case 'Illustrate':
return Illustrate::find($inputs['topic_id']);
default:
return null;
}
}
}

Начало чата

public function get($id) {
$chat = Chat::find($id);

$sender = $chat->sender;

// Inverse
// $systemUser = SystemUser::find($id);
// $systemUser->sentChats->where('id', $chatId);

$receiver = $chat->receiver;

// Inverse
// $customer = Customer::find($id);
// $customer->receivedChats->where('id', $chatId);

$topic = $chat->topic;

// Inverse
// $illustrate = Illustrate::find($id);
// $illustrate->chats;
}

Заметка :- Пожалуйста, поймите, я не проверял ничего из этого … Это всего лишь небольшой пример того, как вы можете добиться цели.

Дайте мне знать, если у вас возникнут проблемы с пониманием этого.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]