请求具有多个id Symfony2 Doctrine

Ajo*_*uve 38 symfony doctrine-orm

我有一个ID数组,我想从我的ID数组中获取一个实体数组.

我不能用find.

sql请求如下所示:

SELECT * FROM mytable WHERE id = 12 OR id = 10 ...
Run Code Online (Sandbox Code Playgroud)

我的id数组上有一个循环.

小智 98

您也可以直接从存储库获取它:

$em->getRepository('YourRepo')->findById(array(1,2,3,4,5));
Run Code Online (Sandbox Code Playgroud)

你也可以在get no tin数组中传递参数,但是用逗号粘贴的简单字符串

?ids=1,2,3,4,56
Run Code Online (Sandbox Code Playgroud)

然后从$ request获得它

$em->getRepository('YourRepo')->findById(explode(',', $request->get('ids'));
Run Code Online (Sandbox Code Playgroud)

  • @Ayk这是一个动态函数,doctrine匹配`id`列.如果您的键列名为`table_name_id`,则该函数将为`findByTableNameId`. (11认同)
  • 我不喜欢使用神奇的东西 - 所以你可以做到 - > findBy(['id'=> $ idsArr)`这会给你你想要的东西 (9认同)
  • findById()不存在 (7认同)

man*_*nix 36

如何使用QueryBuilder类:

$qb = $em->createQueryBuilder();
$qb->select('m');
$qb->from('MyEntity', 'm');
$qb->where($qb->expr()->in('m.id', array(12, 10)));

//ArrayCollection
$result = $qb->getQuery()->getResult();
Run Code Online (Sandbox Code Playgroud)

或者DQL:

$query = $em->createQuery('SELECT m FROM MyTable m WHERE m.id IN(12, 10)');
Run Code Online (Sandbox Code Playgroud)

  • 只是对OP的旁注:请注意,如果您向`QueryBuilder`提供动态数组以测试它是否为空.空`SQL``IN()`expresion导致错误. (9认同)

flu*_*flu 21

只需使用:

$em->getRepository('YourBundle:YourEntity')->findById(array(1, 2, 3, 4));
Run Code Online (Sandbox Code Playgroud)

支持数组作为参数.


The*_*ost 21

如果您不想使用魔术方法,而不是使用这段工作代码:

$em->getRepository('AppBundle:FooEntity')->findById([1, 2, 3]);
Run Code Online (Sandbox Code Playgroud)

......你可以用这个:

$em->getRepository('AppBundle:FooEntity')->findBy(['id' => [1, 2, 3]]);
Run Code Online (Sandbox Code Playgroud)

效果是一样的.

  • @ baldrs,PHPStorm例如将这种方法调用报告为不存在。然后,您必须取消检查此类语句或提供一些PHPDoc注释。鉴于此,我更喜欢只编写方法。以后也更容易重构。 (2认同)