2015-05-31 126 views
0

最近我問了這個問題,得到了一個答案,但不幸的是沒有解決問題,之後,我沒有更多的答案,我真的需要解決這個問題,我有。檢索多個記錄相關的多個記錄laravel 4.2

好吧,我必須爲我的學校做一個測驗網站,用戶應該能夠玩這個測驗,這個頁面需要顯示測驗的名字,與測驗相關的問題和與問題相關的答案。 我可以顯示測驗名稱沒有問題,我也可以顯示問題,但出於某種原因,只顯示與最終問題相關的答案。

這裏是我的代碼:

public function playQuiz($id) 
{ 

    // get all the questions associated to the selected quiz 
    $questions = Question::where('quiz_id', $id)->get(); 

    // get all the answers associated to the questions 
    foreach($questions as $question) 
    { 
     $answers = Answer::where('question_id', $question->id)->get(); 
    } 

    $data = [ 
     'quiz'  => Quiz::find($id), 
     'questions' => $questions, 
     'answers' => $answers 
    ]; 

    return View::make("quizzes.playQuiz", $data); 
} 

的$ id變量是我選擇這樣的測驗,我應該能夠檢索關聯到這個ID的所有數據的id和相關聯的相關數據的所有數據這個ID。

這裏是我的html(帶刀片):

<h3>{{ $quiz->name }}</h3> 

    @foreach($questions as $question) 

      <h4>{{ $question->question }}</h4> 

      @foreach($answers as $answer) 

       @if($answer->question_id == $question->id) 

         <p>{{ $answer->answer }}</p> 

       @endif 

      @endforeach 

    @endforeach 

我知道問題出在我從DB我的答案的方式中,但我不知道如何解決它。非常感謝幫助!謝謝閱讀!

*編輯,

我的DB計劃去如下:

我有

  • 表調用的ID,名稱和說明測驗。
  • 一個ID,問題和外鍵的表稱爲問題「quiz_id」
  • 表調用一個id,答案和外鍵的回答「question_id」

測驗可以有多個問題但一個問題只能有一個測驗, 一個問題可以有多個答案,但答案只能有一個問題。

我希望這是關於我的數據庫的足夠信息,感謝您的幫助!

+1

問題在於你正在寫'$ answer'變量而不是添加到它的foreach循環,這就是爲什麼你只能看到最後一個。無論如何,我認爲這是錯誤的方法,你應該利用Eloquents關係功能。我現在嘗試拋出一個答案,但是你可能需要通過編輯和更新你的問題來解釋你的數據庫模式。 – haakym

+0

感謝您對數據庫架構的更新。我相信我不應該更新我的答案,因爲我所做的假設與您描述數據庫的方式非常相似。我在4.3版本中試圖做到這一點,但是如果你看到某些看起來不正確的東西,比如你在模型中擴展了什麼類,那麼就忽略它。希望你能使它工作,如果你需要幫助,請留下評論。謝謝。 – haakym

回答

0

你應該使用Eloquent的關係來解決這個問題。在這裏看到更多:http://laravel.com/docs/4.2/eloquent#relationships

我目前看到的方式是,您有三種型號,您正在使用:Quiz,QuestionAnswer - 對不對?

從你的問題我備齊下列各項:

  • 一個Quiz將有許多Question小號
  • Answer將屬於一個Question

因此,基於這些假設我會割肉這樣的模型...

注:

  • 我沒有用4.3一會兒,所以你可能需要修改一些代碼,但它應該沒關係下面
  • 模型假設您正在使用外鍵以這樣的方式口才期望你太,如果沒有可以將它們定義爲在關係方法的第二個參數(的hasMany,屬於關聯)

Quiz.php

<?php 

class Quiz extends Eloquent { 

    protected $table = 'quiz'; // or whatever your table is 

    public function questions() 
    { 
     return $this->hasMany('Question'); // this should be the model name 
    } 

} 

Question.php

<?php 

class Question extends Eloquent { 

    protected $table = 'question'; // or whatever your table is 

    public function quiz() 
    { 
     return $this->belongsTo('Quiz'); // defining the inverse of the relation 
    } 

    public function answers() 
    { 
     return $this->hasMany('Answer'); 
    } 

} 

Answer.php

<?php 

class Answer extends Eloquent { 

    protected $table = 'answer'; // or whatever your table is 

    public function question() 
    { 
     return $this->belongsTo('Question'); 
    } 

} 

那麼你的控制器將成爲很多清潔

控制器

public function playQuiz($id) 
{ 
    $quiz = Quiz::find($id); 

    return View::make('quizzes', compact('quiz')); 
} 

查看

<h3>{{ $quiz->name }}</h3> 

@foreach($quiz->questions as $question) 

     <h4>{{ $question->question }}</h4> 

     @foreach($question->answers as $answer) 

      <p>{{ $answer->answer }}</p> 

     @endforeach 

@endforeach 

請讓我知道你是否有實施上述任何問題,我會盡我所能來助陣。關係一開始可能有點棘手,但一旦你把頭轉過來,你就永遠不會回頭。