2017-09-23 81 views
0

laravel使用雄辩从数据库中获取数据。作为相关行下的数组映射连接结果

我有两个表“问题”和“选项” 现在用雄辩的方法来连接“选项”到“问题”

$questions = Question::join('options', 'options.question_id', 'questions.id'); 

return QuestionResource($questions); 

这不会返回数据,其中同一个问题的预期集合在集合中多次出现,并且每个“options.question_id”和“question.id”都是相同的不同选项。

[ 
    { 
     id: 1, 
     text: "Africa is a...?", 
     // joined option 
     question_id: 1, 
     value: "city", 
     answer: false 
    }, 
    { 
     id: 1, 
     text: "Africa is a...?", 
     // joined option 
     question_id: 1, 
     value: "planet", 
     answer: false 
    }, 
    { 
     id: 1, 
     text: "Africa is a...?", 
     // joined option 
     question_id: 1, 
     value: "continent", 
     answer: true 
    }, 
    { 
     id: 2, 
     text: "Albert Heinstein was a...?", 
     // joined option 
     question_id: 2, 
     value: "comedian", 
     answer: false 
    }, 
    { 
     id: 2, 
     text: "Albert Heinstein was a...?", 
     // joined option 
     question_id: 1, 
     value: "genius scientist", 
     answer: true 
    } 
] 

我希望所有选项都嵌套在相关问题的关键字下。像

[ 
    { 
     id: 1, 
     text: "Africa is a...?", 
     // joined options 
     options: [ 
      {value: "city", answer: false}, 
      {value: "planet", answer: false}, 
      {value: "continent", answer: true} 
     ] 
    }, 
    { 
     id: 2, 
     text: "Albert Heinstein was a...?", 
     // joined options 
     options: [ 
      {value: "comedian", answer: false}, 
      {value: "genius scientist", answer: true} 
     ] 
    } 
] 

我可以用laravel雄辩实现这一目标,不然我就必须申请一个额外的逻辑。

+1

你需要PHP简单循环内准备数组,您在'$ questions'收到阵列的集合变量并传递导致阵列作为回应。或者,如果您使用的是简单的'ORM'结构,那么只需在'Question'模型中准备一个关系,并且您可以使用'with'或'load'方法或直接调用来获得该关系 –

回答

1

如果你想applie额外的逻辑这段代码可以帮助你

<?php 
    $combinedqst = array('id' => '','text'=> '','option'=> array('value' => array('value' => ,''), 'answer' => '')); 
    $ids = array('id' => , ''); 
    //loop through questions array 1st loop for getting the question 
    foreach($questions as $question) { 
     $count = 0; 
    //check if question is already looped 
     if(!in_array($question["id"],$ids)){ 
    //2end loop to get the opstions 
     foreach($questions as $question_check) { 

       if($question_check["id"] == $question["id"]){ 
        if($count == 0){ 
        $combinedqst["id"] = $question["id"]; 
        $combinedqst["text"] = $question["text"]; 
        } 
        $count = 1; 
        array_push($combinedqst["option"]['value'],$question_check['value']); 
        array_push($combinedqst["option"]['answer'],$question_check['answer']); 
       } 

      } 
     } 
    array_push($ids,$question["id"]); 
    } 
vardump($combinedqst);