Laravel – многие-ко-многим, где таблица «многие-ко-многим» (частично) полиморфна

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

На данный момент это не проблема. Но пользователи могут получить тот же бонус за разные действия. Итак, скажем, есть бонус для голосования на картинке. Ну, один пользователь мог проголосовать на одной картинке, а другой мог проголосовать за другую картинку, которую я хотел бы сохранить в таблице «многие-ко-многим».

Кроме того, может быть бонус для написания комментария, который, безусловно, является другой таблицей, а не фотографией.

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

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

У тебя есть идеи?

Вероятно, вам придется разрабатывать свои собственные классы отношений. Пример:

МОДЕЛЬ

public function answers() { $instance = new Response(); $instance->setSid($this->sid); return new QuestionAnswerRelation($instance->newQuery(),$this); } 

ВЗАИМОСВЯЗЬ

 use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Relations\Relation; use Pivotal\Survey\Models\Answer; use Pivotal\Survey\Models\Collections\AnswerCollection; use Pivotal\Survey\Models\QuestionInterface; use Pivotal\Survey\Models\SurveyInterface; class QuestionAnswerRelation extends Relation { /** * Create a new relation instance. * * @param \Illuminate\Database\Eloquent\Builder $query * @param \Illuminate\Database\Eloquent\Model $parent * @return void */ public function __construct(Builder $query, QuestionInterface $parent) { $table = $query->getModel()->getTable(); $this->query = $query ->select(array( \DB::raw($parent->sid.'X'.$parent->gid.'X'.$parent->qid . ' AS value'), 'id' )); $this->query = $query; $this->parent = $parent; $this->related = $query->getModel(); $this->addConstraints(); } public function addEagerConstraints(array $models) { parent::addEagerConstraints($models); } public function initRelation(array $models, $relation) { } public function addConstraints() { } public function match(array $models, Collection $results, $relation) { } public function getResults() { $results = $this->query->get(); $answerCollection = new AnswerCollection(); foreach($results as $result) { $answer = new Answer($result->toArray()); $answer->question = $this->parent; $answerCollection->add($answer); } return $answerCollection; } 

В этом случае мы используем Lime Survey, который создает уникальную таблицу (обратите внимание, что значение $ instance-> setSid () изменяет имя таблицы) для каждого из своих опросов и уникальный столбец для каждого из значений ответа -> вопроса. (обратите внимание на $ parent-> sid.'X '. $ parent-> gid.'X'. $ parent-> qid. 'AS value')

Где sid = survey_id, gid = group_id (я думаю) и qid = question_id

Это было довольно раздражающе.

Обратите внимание, как я ссылаюсь на значения родителя, чтобы продолжить разработку запроса. Вы должны быть в состоянии следовать аналогичному маршруту, чтобы достичь того, чего желает ваше сердце, и по-прежнему поддерживать возможность использования Eloquent.