关于透视表和特定功能的最佳实践,我有一个非常基本的问题。
本质上,我有两个实体
球员 问题
我向玩家显示一个问题,当他们回答时,我会根据他们是否正确回答来发起一个奖励他们积分的事件。我现在要做的是创建一个表来存储玩家已回答的问题。所以在这种情况下,我可以将玩家与一个问题联系起来。
之类的,
$player->question()->associate($question);
这将是玩家和问题之间的多对多关系。
我的问题是:
这是实用性和可扩展性方面的最佳解决方案,以及如何获得播放器未在控制器中回答的问题。
基本上与
相反$player->questions();
如果我要使用多对多的关系
更新
模型 PlayerProfiles
<?php
namespace App\Models;
use App\Traits\Pointable;
use Illuminate\Database\Eloquent\Model;
use Prettus\Repository\Contracts\Transformable;
use Prettus\Repository\Traits\TransformableTrait;
/**
* Class PlayerProfiles
* @package App\Models
*/
class PlayerProfiles extends Model implements Transformable
{
use TransformableTrait, Pointable;
/**
* @var string
*/
protected $modelName = 'PlayerProfiles';
/**
* @var array
*/
protected $fillable = ['msisdn'];
/**
* @return string
*/
public function getModelName()
{
return $this->modelName;
}
public function questions()
{
return $this->belongsToMany('App\Models\Questions')->withTimestamps();
}
}
问题
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Prettus\Repository\Contracts\Transformable;
use Prettus\Repository\Traits\TransformableTrait;
class Questions extends Model implements Transformable
{
use TransformableTrait, SoftDeletes;
protected $modelName = 'Questions';
protected $fillable = ['question', 'correct_answer', 'incorrect_answer', 'category_id', 'language_id', 'difficulty_level_id'];
public function getModelName()
{
return $this->modelName;
}
public function playerProfiles()
{
return $this->belongsToMany('App\Models\PlayerProfiles')->withTimestamps();
}
}
迁移
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreatePlayerQuestionsPivotTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('player_questions', function(Blueprint $table)
{
$table->tinyInteger('player_id')->unsigned()->nullable();
$table->tinyInteger('question_id')->unsigned()->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('player_questions');
}
}
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AddForeignKeysToPlayerQuestionsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('player_questions', function(Blueprint $table)
{
$table->foreign('question_id')->references('id')->on('questions')->onUpdate('RESTRICT')->onDelete('CASCADE');
$table->foreign('player_id')->references('id')->on('player_profiles')->onUpdate('RESTRICT')->onDelete('CASCADE');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('player_questions', function(Blueprint $table)
{
$table->dropForeign('player_questions_questions_id_foreign');
$table->dropForeign('player_questions_player_id_foreign');
});
}
}
答案 0 :(得分:0)
这里实际上只有两个问题可以回答:玩家可以回答多个问题吗?并且:许多玩家可以回答一个问题吗?如果答案为是,则自动需要数据透视表。这是最好的做法。