Symfony2,doctrine2,createQuery,如何在数组中搜索?
如何在数组中搜索?请给出建议,尤其是关于以下案例(c)的建议 我不明白我的错误在哪里。我尝试用几种方法在数组中搜索Doctrine列关键字。下面的代码用于调试目的,下面的案例中描述了查询本身Symfony2,doctrine2,createQuery,如何在数组中搜索?,symfony,doctrine-orm,where-in,createquery,Symfony,Doctrine Orm,Where In,Createquery,如何在数组中搜索?请给出建议,尤其是关于以下案例(c)的建议 我不明白我的错误在哪里。我尝试用几种方法在数组中搜索Doctrine列关键字。下面的代码用于调试目的,下面的案例中描述了查询本身 public function findWhereKeyw($searchArr) { print_r('<br> searchstr = '); print_r($searchstr); print_r('</pre>'); print_r('<b
public function findWhereKeyw($searchArr)
{
print_r('<br> searchstr = '); print_r($searchstr); print_r('</pre>');
print_r('<br> searchstr explode = '); print_r( explode(",",$searchstr) ); print_r('</pre>');
print_r('<br> searchArr implode = '); print_r( implode(",", $searchArr) ); print_r('</pre>');
//searchstr = opera, some
//searchstr explode = Array ( [0] => opera [1] => some )
//searchArr implode = opera,some
$query = ...//see cases below
$qsql=$query->getSQL();
$param=$query->getParameters();
print_r('<br>q= <pre>'); print_r($qsql); print_r('</pre>');
print_r('<br>p= <pre>'); print_r($param); print_r('</pre>');
try {
return $query->getResult();
//return $query->getSingleResult();
} catch (\Doctrine\ORM\NoResultException $e) {
return null;
}
或
//根据
b) 这样,我得到的是空数组:
$events = $em->createQuery( 'SELECT e FROM MeetingBundle:Event e WHERE e.'.$colname.' LIKE :keyw' )
->setParameter('keyw', '%'.$val.'%')
->getResult(\Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY);
根据查询(q)和参数(p)确定,我应该能够找到关键字为“opera”的事件。哪里可能是个错误。关键字字段是由逗号分隔的单词组成的字符串 这不是如何使用WHERE搜索的答案。。在里面但使用LIKE可以扭转局面,实际上,LIKE比WHERE-IN要好得多 简言之:
// From your Event repository
$qb = $this->createQueryBuilder('e');
$qb->where($qb->expr()->in('r.keywords', explode(",", $searchstr));
代码必须折射到EventRepository和EventManager。
C:\Bitnami\wampstack-5.5.30-0\sym_prog\proj2_27\src\MeetingBundle\Controller\EventController.php
/**
*搜索事件实体。
*
*@Route(“/search”,name=“事件搜索”)
*@Method(“GET | POST”)
*@Template(“MeetingBundle:Event:ev_search.html.twig”)
*/
公共函数搜索操作(请求$Request)
{
$post=Request::createFromGlobals();
$em=$this->getDoctrine()->getManager();
如果($post->request->has('submit'){
$searchstr=$post->request->get('search_words');
$searchArr=$this->multiExplode(['','',';'','-'],$searchstr);
//打印('searchArr-before-trim=');打印($searchArr);打印('';
foreach($searchArr作为$index=>$value){
如果(strlen(修剪($value))==0){
未设置($searchArr[$index]);
}
}
打印('searchArr after trim=');打印($searchArr);打印('';
$borstatus=$post->request->get('search_或_ck');
$bor=($borstatus=='on')?1:0;
$bandstatus=$post->request->get('search_and_ck');
$band=($bandstatus=='on')?1:0;
$bkeyw=$post->request->get('search_keyw');//检查要执行搜索的表列
$bkeywstatus=($bkeyw=='on')?1:0;
$btitle=$post->request->get('search_title');
$btitlestatus=($btitle=='on')?1:0;
$bdescr=$post->request->get('search_descr');
$bdescrstatus=($bdescr=='on')?1:0;
//倾销(员额);
打印(“”);打印($post);打印(“”);
打印('******************bkeyw=');打印($bkeyw);打印('
');
打印('******************bkeyw=');打印($bkeywstatus);打印('
');
$result=array();//result['colname']=array('opera'=>27'=>(id='27',title='x',…),'24'=>(),…]
foreach($colnameArr作为$colname){
$keywArr=array();//keywArr['opera']=['27'=>(id='27',title='x',…),'24'=>(),…]
foreach($searchArr作为$val){
$events=$em->createQuery('SELECT e FROM MeetingBundle:Event e WHERE e.'.$colname.'LIKE:keyw')
->setParameter('keyw'、'%'.$val.%'))
->getResult(\doctor\ORM\AbstractQuery::hydrome\u数组);
//$res=$em->getResult();不工作
//$res不带数组返回长对象,但在此对象上getId()不起作用
//print_-r('
******************结果');print_-r($events);print_-r('');//非常长的对象
$identArr=array();//$identArr['27']=(id='27',title='x',…)
foreach($events作为$event){
//print_-r('
******************结果');print_-r($event'id');print_-r('')//使用->getResult(\Doctrine\ORM\AbstractQuery::hydrome_数组);
//打印('
******************事件');打印($EVENT.getId());打印('');//使用->getResult();
//print_-r('
******************事件');print_-r($EVENT);print_-r('')//非常长的对象//使用->getResult();
$id=$event['id'];
//所有结果都是唯一的,因为id是唯一的
$identArr[strval($id)]=$event;//$identArr['27']=(id='27',title='x',…)
}//foreach($events作为$event)
$keywArr[$val]=$identArr;//keywArr['opera']=['27'=>(id='27',title='x',…),'24'=>(),…]
未设置($identArr);
}//foreach($searchArr作为$val){
$result[$colname]=$keywArr;//result['colname']=array('opera'=>['27'=>(id='27',title='x',…),'24'=>(),…]
unset($keywArr);
}//foreach($colnameArr作为$colname){
//然后,您必须分析结果,为案例提取事件使用选定:或搜索,并搜索,或仅在特定列中搜索,并仅在特定列中搜索…这将提供finalArray
返回数组('res'=>finalArray,)
}
如果我理解得很好,那么您正在尝试使用DQL执行一个IN。以下是语法:
我假设您的字段关键字只包含一个关键字
$qsrtr= 'SELECT e.id, e.title FROM MeetingBundle:Event e WHERE e.keywords IN (';
foreach ($searchArr as $val) {
$qsrtr.= ':'.$val.', ';
}
$qsrtr=rtrim($qsrtr, ", ");
$qsrtr.=')';
print_r('<br> qsrtr= </pre>'); print_r($qsrtr); print_r('</pre>');
$query = $this->getEntityManager()->createQuery( $qsrtr);
foreach ($searchArr as $val) {
$query->setParameter( $val, $val );
//OR $query->setParameter( ':'.$val, $val ); //this line gives also empty array, and the same parameteres object (p) as line above.
} //gives empty array as the result
qsrtr= SELECT e.id, e.title FROM MeetingBundle:Event e WHERE e.keywords IN (:opera, :some)
q= SELECT e0_.id AS id_0, e0_.title AS title_1 FROM event e0_ WHERE e0_.keywords IN (?, ?)
p= Doctrine\Common\Collections\ArrayCollection Object
(
[elements:Doctrine\Common\Collections\ArrayCollection:private] => Array
(
[0] => Doctrine\ORM\Query\Parameter Object
(
[name:Doctrine\ORM\Query\Parameter:private] => opera
[value:Doctrine\ORM\Query\Parameter:private] => opera
[type:Doctrine\ORM\Query\Parameter:private] => 2
)
[1] => Doctrine\ORM\Query\Parameter Object
(
[name:Doctrine\ORM\Query\Parameter:private] => some
[value:Doctrine\ORM\Query\Parameter:private] => some
[type:Doctrine\ORM\Query\Parameter:private] => 2
)
)
)
$events = $em->createQuery( 'SELECT e FROM MeetingBundle:Event e WHERE e.'.$colname.' LIKE :keyw' )
->setParameter('keyw', '%'.$val.'%')
->getResult(\Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY);
/**
* Search Event entities.
*
* @Route("/search", name="event_search")
* @Method("GET|POST")
* @Template("MeetingBundle:Event:ev_search.html.twig")
*/
public function searchAction(Request $request)
{
$post = Request::createFromGlobals();
$em = $this->getDoctrine()->getManager();
if ($post->request->has('submit')) {
$searchstr=$post->request->get('search_words');
$searchArr = $this->multiExplode( [' ',',',';','-'], $searchstr);
//print_r('searchArr before trim = </pre>'); print_r($searchArr); print_r('</pre>');
foreach ($searchArr as $index => $value) {
if(strlen(trim($value))==0){
unset($searchArr[$index]);
}
}
print_r('searchArr after trim = </pre>'); print_r($searchArr); print_r('</pre>');
$borstatus=$post->request->get('search_or_ck');
$bor = ($borstatus === 'on' ) ? 1 : 0;
$bandstatus=$post->request->get('search_and_ck');
$band = ($bandstatus === 'on' ) ? 1 : 0;
$bkeyw=$post->request->get('search_keyw'); // check in which table columns to perform search
$bkeywstatus = ($bkeyw === 'on' ) ? 1 : 0;
$btitle=$post->request->get('search_title');
$btitlestatus = ($btitle === 'on' ) ? 1 : 0;
$bdescr=$post->request->get('search_descr');
$bdescrstatus = ($bdescr === 'on' ) ? 1 : 0;
//dump($post);
print_r('<pre>'); print_r($post); print_r('</pre>');
print_r('********************** bkeyw = '); print_r($bkeyw); print_r('<br>');
print_r('********************** bkeyw = '); print_r($bkeywstatus); print_r('<br>');
$result=array(); //result['colname']=array( 'opera'=> [ '27' => (id='27', title='x',..), '24'=>(),.....]
foreach ($colnameArr as $colname){
$keywArr=array(); //keywArr['opera']= [ '27' => (id='27', title='x',..), '24'=>(),.....]
foreach ($searchArr as $val) {
$events = $em->createQuery( 'SELECT e FROM MeetingBundle:Event e WHERE e.'.$colname.' LIKE :keyw' )
->setParameter('keyw', '%'.$val.'%')
->getResult(\Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY);
// $res = $em->getResult(); does not work
// $res without HYDRATE_ARRAY returns long object, but on this object getId() is not working
// print_r('<br>*******************result <pre>'); print_r($events); print_r('</pre>');// very long object
$identArr=array();//$identArr[ '27'] = (id='27', title='x',..)
foreach ($events as $event){
//print_r('<br>*******************result <pre>'); print_r($event'id'); print_r('</pre>');//using ->getResult(\Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY);
// print_r('<br>*******************EVENT <pre>'); print_r($event.getId()); print_r('</pre>');// using ->getResult();
// print_r('<br>*******************EVENT <pre>'); print_r($event); print_r('</pre>');// very long object //using ->getResult();
$id = $event['id'];
// all results are unique, because id are unique
$identArr[strval($id)]=$event ; //$identArr[ '27'] = (id='27', title='x',..)
}//foreach ($events as $event)
$keywArr[$val]=$identArr; //keywArr['opera']= [ '27' => (id='27', title='x',..), '24'=>(),.....]
unset($identArr);
}//foreach ($searchArr as $val) {
$result[$colname] = $keywArr; //result['colname']=array( 'opera'=> [ '27' => (id='27', title='x',..), '24'=>(),.....]
unset($keywArr);
} //foreach ($colnameArr as $colname){
// than you have to analyse result, to extract events for cases use selected: OR search, AND search, OR search only in certain columns, AND search only in certain columns... This will give finalArray
return array ('res'=>finalArray, )
}
// From your Event repository
$qb = $this->createQueryBuilder('e');
$qb->where($qb->expr()->in('r.keywords', explode(",", $searchstr));