2017-03-27 1 views
0

多くのユーザーは多くの項目を持つことができます。しかし、私は特定のユーザーが所有する特定のアイテムのリストを取得したい。Symfony:多対多で子のwhere節

ユーザエンティティ:

class User 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * Many Users have many items 
    * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Item", fetch="EAGER") 
    * @ORM\JoinTable(name="users_items", 
    *  joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="item_id", referencedColumnName="id")} 
    *  ) 
    */ 
    private $items; 

} 

アイテムのエンティティ:

class Item 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="name", type="string", length=10) 
    */ 
    private $name; 

} 

Doctrineはその後、作成した3つのテーブル:私は取得したい

items 
users 
users_items 

は、私は2つのエンティティを持っていますすべてのite ms name d "ペンシル"が所有していますuserId 11.

どうすればいいですか?

ありがとうございます。 (構文は多分完璧ではありません)私は、この作品を確認していない

$items= $em->getDoctrine->createQueryBuilder() 
     ->select('[items]') 
     ->from(User::class, 'users') 
     ->join('users.items', 'items') 
     ->where('users.id = :userId') 
     ->setParameter('userId', $theId) 
     ->getQuery() 
     ->getResult(); 

が、理論的にはそれは、あなたの場合の問題点は、所有側のみが知っていることである必要があります。

答えて

1

ユーザーとアイテムの間にUNIdirectional many-to-many relationを使用していることをご理解ください。ユーザーはどのアイテムが彼に属しているのかを知っていますが、Itemはどのユーザーがこのアイテムを使用しているのかわかりません。したがって、名前でフィルタリングされたアイテムのコレクションを使用して、データベースからユーザーIDごとに1人のユーザーを取得できます。 user-idが存在しないか、ユーザーにフィルタに一致する項目がない場合、$ userはNULLになります。私の例のコントローラーの例外の代わりに、あなたがnullかどうかを確認するために、twigのif-elseステートメントを使用することができます。

namespace AppBundle\Controller; 

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

class DefaultController extends Controller 
{ 
    /** 
    * @Route("/someroute", name="some_route") 
    */ 
    public function someAction() 
    { 
     $em = $this->getDoctrine()->getManager(); 

     // for this example two hardcoded parameters. $user might be NULL ! 
     $user = $em->getRepository('AppBundle:User')->getItemsWithNameForUser(1, 'Pencil'); 

     if(null === $user) 
     { 
      throw $this->createNotFoundException('This user does not have the selected items or the user does not exist'); 
     } 

     return $this->render('default/index.html.twig', [ 
      'user' => $user 
     ]); 
    } 
} 

とUserRepository:

namespace AppBundle\Repository; 

class UserRepository extends \Doctrine\ORM\EntityRepository 
{ 
    public function getItemsWithNameForUser($userId, $itemName) 
    { 
     return $this->getEntityManager()->createQuery(
      'SELECT u,i FROM AppBundle:User u JOIN u.items i WHERE u.id=:id AND i.name=:name' 
     ) ->setParameter('id', $userId) 
      ->setParameter('name', $itemName) 
      ->getOneOrNullResult(); 
    } 

} 
0

私はそれはのようなものであるべきだと思います関係については、あなたは反対側から照会したいです。

関連する問題