2017-02-18 29 views
-1

私は、自分のリポジトリの1つでquerybuilder(またはSQLリクエスト)を実行することになっています。 私が検索すべての例では、非常に複雑であり、私は私が私が私が私のクエリを行う必要があります知っているRestaurantRepositoryを持ってRestaurantController という名前のコントローラを持っている基本的なQueryBuilder基本QueryBuilder - Symfony3

の基本的な説明を求めていました。

私は私の実体が、私はそう基本的に私は、クエリを作りたい(ID 1を含まない)2列

  • 名前

を持ってRestaurant.phpと呼ばれてい

class RestaurantRepository extends \Doctrine\ORM\EntityRepository 
{ 

} 

どこで私はcityを拾うことができますし、私のビューでそれを使用することができます。どうやってやるの? :/

私は私のコントローラで直接1作成:

$em = $this->getDoctrine()->getManager(); 
$restaurants = $em->getRepository('AppBundle:Restaurant')->findBy(array('city' => $request->request->get('city'))); 

を私は本当に適切かつシンプルなquerybuilderを作る方法を知りたいので、これはうまく機能していません。ありがとう

+0

ステップですか?ここから始めてください:http://symfony.com/doc/current/doctrine.html – Cerad

答えて

1

「これは動作していません」と言うときは、$request->request->get('city')が有効な都市名を返すことを確認する必要があります。コントローラでは、return var_dump($request->request->get('city')を実行して、期待される都市があることを確認できます。私の意見では、それは$request->get('city')でなければなりません。だから、基本的には:

$em = $this->getDoctrine()->getManager(); 
$currentCity = $request->request->get('city') 
return var_dump($currentCity)//make sur that you have a valid city 
$restaurants = $em->getRepository('AppBundle:Restaurant')->findBy(array('city' => $currentCity)); 

カスタムクエリを作成することができますが、それはあなたの必要性のために行き過ぎステップバイ

class RestaurantRepository extends EntityRepository 
{ 
    public function getRestaurantByCity($city) 
    { 
     $query = $this->createQueryBuilder('r') 
         ->where('r.city = :city') 
         ->setParameter('city', $city) 
          ; 

     return $query->getQuery()->getResult(); 
    } 
} 
+0

こんにちは!ご回答どうもありがとうございました!私は誰も私に答えないだろうと思った:) なぜあなたは '' r''をcreateQueryBuilderに入れたのか説明できますか?これらの句読点は何を表していますか? '=:city' また、このqueryBuilderをビューに渡すにはどうしたらいいですか?あなたは 'return $ query-> getQuery() - > getResult();を書いたので、どうやってそれを知って、私の小枝で使うことができますか? –

+0

[doc](http://symfony.com/doc/current/doctrine.html#querying-for-objects-using-doctrine-s-query-builder)を見てください。つまり、 '' r''はエイリアスです(あなたが望むなら 'bestDevEver 'と呼ぶことができます)。 '=:city 'は、都市のフィールドが指定された文字列と等しい場合にレストランを取得することを意味します。 SQLインジェクションを避けるには、クエリにローカル変数を作成し、その値を 'setParameter()'で代入します。あなたの小枝のテンプレートでは、 '{{restaurant.city}}'のようなものによってforループ内のレストランのプロパティにアクセスできます。 1つのアドバイス、あなたは本当にtutoに従うか、いくつかのドキュメントを読んでください... – mickdev

+0

ありがとう、私はしようとしますが、私は多くのドキュメントを読むが、私はいつもどこから始めるべきかわからないが、私はあなたの答えを適用します。 –