Doctrine findOneBy simple_array 属性 未返回有效匹配项
Doctrine findOneBy simple_array property isn't returning a valid match
我有一个包含 simple_array 属性 $publicComments:
的实体 LongBeachClickerUploadBallotOption
/**
* @var array
* @ORM\Column(name="public_comments", type="simple_array", nullable=true)
*/
protected $publicComments;
当我实例化一个新对象并给它多个 publicComments,然后尝试查询该对象时,学说似乎 return 不匹配:
$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
这是怎么回事?出于好奇,我尝试使用整数 "strings" 和真整数进行查询。
根据 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"));
只为它抱怨:
警告:内爆():传递的参数无效
AFAIK,你必须 query array fields like a standard text field。
所以 imloding 数组是最简单的方法。
我知道这个问题很老了,但由于我偶然发现了同样的问题... 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()
以避免观察到关于 implode 中无效参数的投诉。我会说这是在搜索上下文中处理 simple_array 的错误。
我有一个包含 simple_array 属性 $publicComments:
的实体 LongBeachClickerUploadBallotOption/**
* @var array
* @ORM\Column(name="public_comments", type="simple_array", nullable=true)
*/
protected $publicComments;
当我实例化一个新对象并给它多个 publicComments,然后尝试查询该对象时,学说似乎 return 不匹配:
$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
这是怎么回事?出于好奇,我尝试使用整数 "strings" 和真整数进行查询。
根据 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"));
只为它抱怨:
警告:内爆():传递的参数无效
AFAIK,你必须 query array fields like a standard text field。 所以 imloding 数组是最简单的方法。
我知道这个问题很老了,但由于我偶然发现了同样的问题... 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()
以避免观察到关于 implode 中无效参数的投诉。我会说这是在搜索上下文中处理 simple_array 的错误。