我有一个名为 Bonus 的表。用户可以通过某些操作获得奖金(就像奖励)。那么,奖金可以分配给许多用户,并且许多用户可以获得相同的奖金。所以用户和奖金之间是多对多的关系。
到目前为止这没有问题。但用户可以通过不同的操作获得相同的奖励。假设对图片进行投票有奖励。好吧,一个用户可以对一张图片进行投票,另一个用户可以对另一张图片进行投票,我想将其保存在多对多表中。
此外,撰写评论可能会获得奖励,这显然是另一个表格,而不是图片投票。
这里的问题是我需要在奖金表中保存多态类型,在多对多表中保存 ID。
我认为这应该是最好的方法,但是我如何用 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 的可行性。
关于php - Laravel - 多对多,其中多对多表是(部分)多态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32416872/