2016-03-21 16 views
0

私はページをLaravelに変換しています。 私は、どのテーブルからも選択クエリを処理するPHPスクリプト(GET)を使用していました。私がしなければならなかったのは、tableパラメーターを送信しただけで、結果が返されます。問題は、ページがこのクエリを3回実行されることであるLaravel - コントローラを複数回使用する

<?php 

namespace App\Http\Controllers; 

use Illuminate\Http\Request; 

use App\Http\Requests; 
use DB; 

class Projects extends Controller 
{ 
    /** 
    * Get projects based on the table 
    * 
    * @return Response 
    */ 
    public function index($table) 
    { 
     $result = DB::select("SELECT projectid FROM `" . $table . "` WHERE isClass=1 LIMIT 10"); 

     return view('pages.allviews', ['results' => $result]); 
    } 
} 

アイデアは、このようなコントローラーを持っていることでした。 コントローラが実行後にViewを作成し、コントローラ内でクエリを3回繰り返す唯一の解決方法があります。

私はそれを避けたいと思っています。コントローラがページの必要とするものを切り離し、ページに必要な時間に実行できるようにしたいと思います。一般化が鍵です。

これを行う方法はありますか?新しいコントローラーを作成せずにこの抽象化を維持しますか?

+0

別のクラスを作成します。別のクラスを作成するには、名前空間が適切であれば、必要なときに参照することができます。 – ggdx

+0

同じビューで3回参照する方法の例を教えてもらえますか? –

+0

** \ path \ for \ namespace \ classname **を使用すると、** $ this-> data ['grabbed_stuff'] = classname :: method(); **次に** view( 'some.view'、$この - >データ)**。 $ grabbed_stuffはあなたのビューで利用可能になります – ggdx

答えて

1

これを実行する方法はたくさんありますが、最も重要なことは、コントローラから別のクラスにクエリロジックを抽出して、オブジェクトを再利用できるようにすることです。基本的に、リポジトリクラスはこれには適していますが、クエリーオブジェクトも作成することが可能です。とにかく、簡単にしましょう。だから、私が言及したように、あなたは多くの選択肢を持っており、あなたのプロジェクトによっては、戦略を決めることができます。

あなたの場合、単にDB::table()メソッドを使用してしばらくキャッシュすることができます。そのため、次回以降の呼び出しでは、キャッシュされた結果が返されます。今examleを参照してください。これはあなたの問題を解決するかもしれないが、そう

if(\Cache::has('users')) { 
    $users = \Cache::get('users'); 
} 

が、私はあなたが別のクラスを作成することをお勧めしておいてください。

$limit = 10; 
$table = 'users'; 
$select = ['id', 'name']; 
$result = \Cache::remember($table, 60, function() use ($table, $select, $limit) { 
    return \DB::table($table)->limit($limit)->get($select); 
}); 

はその後、キャッシュされたクエリにアクセスするには、あなたはこれを使用することができます例えば、そのクラス内(キャッシング)そのクエリロジック、:

namespace Some\Namespace; 

use DB, Cache; 

class CachedQuery { 

    public function getResult($table, $select = '*', $limit = 10, $timeout = 60) 
    { 
     return Cache::remember($table, $timeout, function() use ($table, $select, $limit) { 
      return DB::table($table)->limit($limit)->get($select); 
     }); 
    } 
} 

次にようにそれを使用します。

use Some\Namespace\CachedQuery; 

class SomeController extends Controller { 
    public function index(CachedQuery $cachedQuery, $table) 
    { 
     // The $table parameter is required, rest are optional 
     $result = $cachedQuery->getResult($table, ['projectid']); 
    } 
} 

また、IoC/Service Containerオブジェクトを使用してデータを一時的に保存できます。また、インターフェイスを作成してインターフェイスをクラスにバインドしてService Containerから取得することもできますが、できるだけ簡単に保ちました。あなたはアイデアを持っているといいですね。また、Cacheコンポーネントも確認してください。

+0

ありがとう、それは有用です。しかし、Viewでたくさんのクエリを作成したいと思っています。各コントローラを同じビューで呼び出すにはどうすればよいですか? –

+1

さて、あなたはビューの中から質問をすることは考えていません。 –

+0

これを考慮すると、通常の動作と一般的な使用が考えられますが、どうすればいいですか? 必要なときにページ内のクエリを呼び出すだけですか?またはそれを抽象化する方法はありますか? –

関連する問題