Doctrine findOneBy simple_array属性不是';t返回有效的匹配项


Doctrine findOneBy simple_array property isn't returning a valid match

我有一个实体LongBeachClickerUploadBallotOption,它包含一个simple_array属性$publicComments:

/**
 * @var array
 * @ORM'Column(name="public_comments", type="simple_array", nullable=true)
 */
protected $publicComments;

当我实例化一个新对象并给它多个publicComments,然后尝试查询该对象时,条令似乎不会返回匹配项:

$lbBallotOption = new LongBeachClickerUploadBallotOption('AMPC', array('1', '2', '3'));
$this->em->persist($lbBallotOption);
$this->em->flush();
dump($lbBallotOption->getPublicComments());
$bo = $this->em->getRepository('VoteBundle:LongBeachClickerUploadBallotOption')
    ->findOneBy(array('motion' => 'AMPC', 'publicComments' => array('1', '2', '3')));
dump($bo);
$bo = $this->em->getRepository('VoteBundle:LongBeachClickerUploadBallotOption')
    ->findOneBy(array('motion' => 'AMPC', 'publicComments' => array(1, 2, 3)));
dump($bo);
exit;

该代码输出以下内容:

HearingVoteImport.php on line 258:
array:3 [▼
  0 => "1"
  1 => "2"
  2 => "3"
]
HearingVoteImport.php on line 263:
null
HearingVoteImport.php on line 268:
null

这是怎么回事?出于好奇,我尝试同时使用整数"字符串"和true int进行查询。

根据Doctrine的SimpleArrayType,它应该用","内爆这些值,然后我假设只进行字符串匹配。。。我可以看到数据库中的行存储正确:

id    motion   public_comments
109   AMPC     1,2,3

编辑:我添加了SQL日志:

$this->em->getConnection()->getConfiguration()->setSQLLogger(new 'Doctrine'DBAL'Logging'EchoSQLLogger());

并输出以下内容:

  SELECT t0.id AS id1, 
  t0.motion AS motion2, 
  t0.public_comments AS public_comments3 
  FROM lb_clicker_upload_ballot_option t0 
  WHERE t0.motion = ? AND t0.public_comments IN (?) LIMIT 1 
  array(2) { [0]=> string(4) "AMPC" [1]=> array(3) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "3" } } 
  array(2) { [0]=> string(6) "string" [1]=> int(102) }

当然,正如第一个响应中提到的,我试着这样查询:

$bo = $this->em->getRepository('VoteBundle:LongBeachClickerUploadBallotOption')
        ->findOneBy(array('motion' => 'AMPC', 'publicComments' => "1,2,3"));

只为它抱怨:

警告:内爆():传递的参数无效

我知道这个问题很老了,但由于我偶然发现了同样的问题。。。SQL日志记录非常有用。

问题是,在public_comments中,数据库中存储了一个由逗号分隔的字符串组成的字符串。必须在给定给IN关键字的数组中找到此字符串。由于在这个数组中,值是分开的,并且不像在public_comments中那样连接到字符串,所以IN运算符找不到字符串。

我通过将$search阵列准备为来规避这个问题

$public_comments = array(1, 2, 3);
$search = array(implode(',', $public_comments));
$repo = $this->em->getRepository('VoteBundle:LongBeachClickerUploadBallotOption');
$bo = $repo->findOneBy(array('motion' => 'AMPC', 'publicComments' => $search));

需要包装array()来避免观察到的对内爆中无效参数的抱怨。我认为这是在搜索上下文中处理simple_array的一个错误。

AFAIK,您必须像查询标准文本字段一样查询数组字段。因此,嵌入数组是最简单的方法。