2016-08-19 15 views
-3

Laravel 5.2実生活ルーティングユースケースを投稿していますが、その回答が必要です。問題:複数の異なるデータベース検索のURL構造が同じです。 URL構造を簡単にする方法についてはコメントを投稿しないでください。これは構造が必要であり、多くのサイトがこのセグメントでそれを使用する方法です。Laravelルーティング実生活ケース

URL構造あなたはうまくそれを行うだろうか

domain.com/{slug1}/{slug2}/{slug3} 
// e.g. domain.com/cottages/slovakia/cheap 
// {slug1} - DB table accommodation_types (20+) 
// {slug2} - DB table locations (300+) 
// {slug3} - DB table accommodation_categories e.g. cheap etc. (100+) 

domain.com/{slug1}/{slug2} 
// e.g. domain.com/cottages/cheap OR domain.com/slovakia/cheap 
// {slug1} - DB table accommodation_types OR locations 
// {slug2} - DB table locations OR accommodation_categories 

domain.com/{slug} 
// DB table accommodation (10000+ entries) 
// or 
// accommodation_types OR locations OR accommodation_categories 

?私はこれらの考えを持っています。

a。クロージャを使用し、URLセグメントを調べた後に適切なコントローラを呼び出しますか?

Route::get('{slug1}', function ($slug1, $slug2 = null, $slug3 = null) 
{ 
    // Check accommodation 
    $object = Accommodation::where('slug', $slug1)->first(); 

    if(!is_null($object)) 
    { 
     return app()->make('AccommodationDetailController')->view($object); 
    } 

    // Check type 
    $type = AccommodationType::where('slug', $slug1)->first(); 

    if(!is_null($type)) 
    { 
     return app()->make('AccommodationListController')->view($type); 
    } 

    // etc. 
}); 

B。 forループで数千のURLを生成し、それをキャッシュしますか?

私は最善の方法は、同じコントローラのアクションに、これらすべてのルートを送信し、送信されたパラメータに応じてクエリを編集することだと思い、他の優れたソリューション:)

+0

なぜdownvotingですか?理解していない。 – Kyzo

答えて

0

を感謝しています。例えば

、これはあなたのルーティングファイルのようになります。コントローラで

<?php 

Route::get('{slug1}', '[email protected]'); 
Route::get('{slug1}/{slug2}', '[email protected]'); 
Route::get('{slug1}/{slug2}/{slug3}', '[email protected]'); 

、あなたがルートから受け取った変数に応じて、SQLクエリを構築するために雄弁またはクエリビルダを使用することができます。以下は簡単な例です:

<?php 

class Controler { 

    public function getPage($slug1, $slug2 = null, $slug3 = null) { 

     $models = Model::where(function ($query) use ($slug1) { 
      $query->where('accomodation_types', $slug1) 
       ->orWhere('location', $slug1); 
     }) 
     ->where(function ($query) use ($slug2) { 
      if (isset($slug2)) { 
       // Slug2 query 
      } 
     }) 
     ->where(function ($query) use ($slug3) { 
      if (isset($slug3)) { 
       // Slug3 query 
      } 
     }) 
     ->get(); 

    } 

} 
+0

しかし、宿泊施設の詳細とAccommodationList +検索のための異なるデータベーステーブルと全く異なるコントローラーがあります。 – Kyzo

関連する問題