php - Laravel - 多对多,其中多对多表是(部分)多态

标签 php mysql laravel laravel-4 polymorphism

我有一个名为 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/

相关文章:

php - Laravel - 所有默认验证错误消息的列表

javascript - 如何在 Laravel Mix 中使用全局 JS 变量?

php - 用户的 Ratchet 存储连接和在服务器实异常(exception)发送消息

php - 在 MySQL 中选择 float

php - MySQL 更新查询 - 按行号

php - 为什么有人会使用 printf() 来处理几乎所有事情?

php - Laravel withCount 包含 null 关系

php - 如果 var 为空需要退出函数并使 ajax 显示错误 PHP/AJAX

php mysql 表2的总和并按表的字段分组

mysql - 查找日期范围内商店中存储架的可用性