2017-08-28 2 views
0

J'ai une question très simple concernant les tableaux croisés dynamiques et les meilleures pratiques pour une fonctionnalité spécifique.Une table pivotante est-elle la meilleure solution?

Essentiellement, j'ai deux entités

Joueurs Questions

J'affiche une question à un joueur, et quand ils répondent, je tire un événement pour les points de récompense ou non selon si elles avaient répondu correctement ou non. Ce que je veux faire maintenant, c'est créer une table pour stocker la question à laquelle le joueur a répondu. Donc, dans l'événement, je peux associer le joueur avec une question.

quelque chose comme,

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

Ce sera une relation plusieurs à plusieurs entre le joueur et la question.

ma question ici est cependant ceci:

Est-ce la meilleure solution en termes de fonctionnalité et d'évolutivité, ainsi que, comment pourrais-je obtenir les questions que le joueur n'a pas répondu dans le contrôleur.

essentiellement à l'opposé de

$player->questions(); 

Si je devais utiliser une relation plusieurs à plusieurs

MISE À JOUR

modèles 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(); 
    } 

} 

Questions

<?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(); 
    } 
} 

Migrations

<?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

Vous avez raison, c'est une faute de frappe de ma part, mise à jour maintenant –

+0

Alors oui, c'est la meilleure solution. Ensuite, vous pouvez ajouter la réponse là aussi. Ensuite, vous avez un journal de ce que les joueurs ont réellement répondu. –

+0

Cool, cela semble juste dans ma tête, en termes d'obtenir une question qu'un joueur n'a pas encore répondu, pensez-vous que la création d'un trait qui exécute cette requête suffirait? –

Répondre

0

Il y a en fait seulement 2 questions ici pour répondre: une réponse peut joueur à plusieurs questions? Et: Une question peut-elle être résolue par de nombreux joueurs? Si la réponse est OUI, vous avez automatiquement besoin d'un tableau croisé dynamique. C'est la meilleure pratique.

+0

Le joueur répondra à plusieurs questions et plusieurs joueurs pourront répondre aux questions –

+0

C'est alors! Comme je l'ai dit ... vous avez besoin d'un tableau croisé dynamique pour cela. – lewis4u