2016-12-16 15 views
1

私はLaravelを使用しています。私はEloquentを使用してデータを取得したいと思います。効率的な方法でデータを分離する

マイコントローラ:

public function getquesdet(){ 
    $id = Request::input('id'); 

    $question = Question::where('q_id','=',$id)->with('qtags.tags')->with('comments')->with('answers') 
    ->first(); 
    $i=0; 
    $tagnames[]=0; 
    foreach ($question['qtags'] as $value) { 
     $tagnames[$i] = $value['tags']['tag']; 

     $i++; 
    } 
    $j=0; 
    $comments[]=0; 
    foreach ($question['comments'] as $value) { 
     $comments[$j] = $value['comment']; 

     $j++; 
    } 
    $k=0; 
    $answers[]=0; 
    foreach ($question['answers'] as $value) { 
     $answers[$k] = $value['answer']; 

     $k++; 
    } 


    return array('question'=>$question['title'],'body'=>$question['body'],'tags'=>$tagnames,'comments'=>$comments,'answer'=>$answers); 

} 

あなたが見ることができるように、私はforeachループの使用が効率的ではないと感じています。 forループを使用すると、さらに時間がかかることがあります。私が望むのは、これに効率的な回避策があるかどうかを知ることです。私はそれが効率的なソリューションのように見えると思います

enter image description here

+1

実際には、 'for'ループを使用するとp少なくともメモリ消費に関しては、より効率的になります。別の可能性は 'array_column()'を使用しています - もしそれが 'ArrayAccess'オブジェクトで動作するならば、あなたのユースケースのためによりよく最適化されるかもしれません。しかし、オーバヘッドのほとんどはORM自体から来ているので、あなたはここでボトルネックを目標にしていないので、可能な利益は無視できるものになります。 – Narf

答えて

0

あなたがテーブルから選択された列をしたいなら、あなたはとしてselect()メソッドを使用することができます。そして、あなたは配列としてそれを返すことができ

$question = Question::where('q_id','=',$id) 
       ->select('title', 'body') 
       ->with([ 
        'qtags' => function($q) { 
         $q->select('tag'); 
        }, 
        'qtags.tags' => function($q) { 
         $q->select('comment'); 
        }, 
        'answers' => function($q) { 
         $q->select('answer'); 
        } 
       ]) 
       ->first(); 

return $question->toArray(); 

Docs

+0

これは私が探しているものですが、私はこれらの3つの場合の空の配列によって返されています: - 答え、qtags、qtags、タグ – uttejh

+0

それは私のために働いています。詳細については、[docs](https://laravel.com/docs/5.3/eloquent-relationships#constraining-eager-loads)をご確認ください。 –

+1

私はセレクト – uttejh

1

$questionは次のように返されます。 3つのfor loopsのおかげで、複雑さはO(3n) - >O(n)となり、すばらしいはずです。非常に大量のコメント、タグ名、質問のコレクションがある場合、私はSQLレベルで問題を解決しようとしますが、それはもっと速くすべきですが、小さな結果セットでは十分です。

Big O notation

関連する問題