2017-08-28 10 views
0

ピボットテーブルと特定の機能のベストプラクティスに関する非常に基本的な質問があります。本質的にはピボットテーブルは最適なソリューションですか?

、私は2つのエンティティ

プレーヤー 質問

私はプレイヤーに質問を表示し、彼らは答えるとき、私は彼らが答えた場合に応じて、ポイントかどうかを報いるためイベントを発生さを持っています正しくないか。私が今したいのは、プレイヤーが何の質問に答えたかを格納するテーブルを作成することです。だから、私はプレイヤーを質問に関連付けることができます。

何かのように、

$player->question()->associate($question); 

これはプレイヤーと質問の間に多くの関係に多くの上になります。ここ

私の質問は、しかし、このです:

は、私は、プレイヤーがコントローラに答えていない質問になって行くだろうか、これは実用性とスケーラビリティの面で最適なソリューションです、など。

基本的に

$player->questions(); 

の反対は、私が

UPDATE

モデル 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(); 
    } 

} 

質問

01多くの関係に多くを使用した場合の
<?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

はい、それが最適な解決策です。次に、そこに回答を追加することもできます。次に、プレイヤーが実際に答えたもののログがあります。 –

+0

クール、これは私の頭の中で、プレイヤーがまだ答えていない質問を得るという観点からは、このクエリを実行する特性を作成すれば十分だろうと思いますか? –

答えて

0

実際には2つの質問はここに答えることがあります。複数の質問に対するプレイヤーの答えはできますか?そして:多くの選手が1つの質問に答えることができますか?答えがYESの場合は、自動的にピボットテーブルが必要です。それがベストプラクティスです。

+0

プレイヤーは複数の質問に回答し、質問には複数のプレイヤーが回答することができます –

+0

それはそれです!私が言ったように...あなたはそれのためのピボットテーブルが必要です。 – lewis4u

関連する問題