DocProine findOneBy simple_array属性未返回有效匹配

时间:2015-11-19 19:33:36

标签: php symfony doctrine-orm doctrine

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

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

当我实例化一个新对象并给它多个publicComments,然后尝试查询该对象时,doctrine似乎没有返回匹配:

$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

这里发生了什么?出于好奇,我尝试用整数“字符串”和真正的整数来查询。

根据Doctrine的SimpleArrayType,它应该用','来破坏这些值然后我会假设只是做一个字符串匹配...我能看到的数据库中的行正确存储:

id    motion   public_comments
109   AMPC     1,2,3

编辑: 我添加了SQL Logging:

$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"));

只是为了抱怨:

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

2 个答案:

答案 0 :(得分:0)

AFAIK,你必须query array fields like a standard text field。 因此,将数组转换为最简单的方法。

答案 1 :(得分:0)

我知道这个问题很老了,但是因为我遇到了同样的问题...... SQL Logging非常有用。

问题是,在set( $pageParameters.wiEndDate = ($pageParameters.wiStartDate+ 30)) 中,一串逗号分隔的字符串存储在数据库中。必须在赋予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)); 以避免观察到有关内爆中无效参数的投诉。我说它是在搜索环境中处理simple_array的一个错误。