我在Symfony2中有三个SQL语句,它们都使用包含记录ID的变量(使用URL传递)。第一个SQL语句可以正常工作,但是其他两个不能。它们经常导致这样的错误:
执行'SELECT m0_.name AS name0时发生异常, m0_.created AS created1,m0_.event_date AS event_date2, m0_.description AS description3,m0_.event_type AS event_type4, m1_.surname AS surname5,m1_.first_name AS first_name6 FROM map_lists m0_ LEFT JOIN map_list_members m2_ ON(m2_.list_id = m0_.id)LEFT JOIN map_contacts m1_ ON(m1_.id = m2_.contact_id)WHERE m0_.branch_id =? AND m0_.event_type IS NOT NULL和m1_.id =? ORDER BY m0_.event_date DESC'与params {“1”:“0”,“2”:{}}:
捕获致命错误:类Doctrine \ ORM \ Query的对象不可能 转换为字符串 F:\ WAMP \ WWW \ centredb \供应商\原则\ DBAL \ LIB \原则\ DBAL \ Connection.php 第1211行
有问题的两个SQL语句是:
// Retrieve Test For That Member
$membertests = $dm->createQuery('
SELECT mt.id, mt.taken, mt.result, mtd.test, mtd.description
FROM InstructorBundle:MapTests mt
LEFT JOIN InstructorBundle:MapTestDescriptions mtd WHERE mtd.id = mt.testDescription
WHERE mt.contact = :member'
)->setParameter('member', '40264');
$memtest = $membertests->getResult();
// Retrieve Events For That Member
$memberevents = $dm->createQuery('
SELECT mli.name, mli.created, mli.eventDate, mli.description, mli.eventType, mc.surname, mc.firstName
FROM InstructorBundle:MapLists mli
LEFT JOIN InstructorBundle:MapListMembers mlm WHERE mlm.list = mli.id
LEFT JOIN InstructorBundle:MapContacts mc WHERE mc.id = mlm.contact
WHERE mli.branch = :centre
AND mli.eventType IS NOT NULL
AND mc.id = :member
ORDER BY mli.eventDate DESC'
)->setParameters(array(
'centre' => $centreid,
'member' => $member
));
$memevent = $memberevents->getResult();
现在,如果我从参数中删除$member
并将其替换为我在开发期间使用的记录ID,则这些SQL语句可以正常工作。显然这不是理想的,所以要找出为什么这些SQL语句在使用第三个使用的相同变量时失败是至关重要的。
第三个SQL语句,供参考,是:
// Retrieve Member Details
$member = $dm->createQuery('
SELECT mc.id, mc.surname, mc.firstName
FROM InstructorBundle:MapSubscriptions msu
LEFT JOIN InstructorBundle:MapContacts mc WHERE msu.contact = mc.id
LEFT JOIN InstructorBundle:MapFamilies mf WHERE mc.family = mf.id
WHERE mc.id = :member'
)->setParameter('member', $member);
我查看了两个表中的实体以及$member
用于从中恢复数据的两个字段。它们看起来像这样:
MapTests mt
/**
* @var \MapContacts
*
* @ORM\ManyToOne(targetEntity="MapContacts")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="contact_id", referencedColumnName="id")
* })
*/
private $contact;
/**
* Set contact
*
* @param \Acme\InstructorBundle\Entity\MapContacts $contact
* @return MapTests
*/
public function setContact(\Acme\InstructorBundle\Entity\MapContacts $contact = null)
{
$this->contact = $contact;
return $this;
}
/**
* Get contact
*
* @return \Acme\InstructorBundle\Entity\MapContacts
*/
public function getContact()
{
return $this->contact;
}
MapContacts mc
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
我无法弄明白,对我来说似乎很好。但显然有些事情阻止了这种做法。
答案 0 :(得分:1)
您的$member
变量是否为对象?您需要在查询中使用整数ID作为参数,因此请将$member
替换为$member->getId()
答案 1 :(得分:0)
这是一个非常奇怪的问题,因为$member
变量适用于一个查询但不适用于其他两个查询。但是,添加此代码似乎解决了这个问题:
$memberint = intval($member);
这似乎解决了这个问题。错误消失了。但是,它并没有解释为什么$member
将使用一个查询而不是其他两个查询。
答案 2 :(得分:0)
我建议使用dsl,即Doctrine提供的查询语言。您的第二个查询如下:
$dm->createQuery()
->select('mli.name, mli.created, mli.eventDate, mli.description, mli.eventType, mc.surname, mc.firstName')
->from('InstructorBundle:MapLists', 'mli')
->leftJoin('mli.list', 'mlm')
->leftJoin('mlm.contact', 'mc')
->where('mli.branch = :centre')
->andWhere('mli.eventType IS NOT NULL')
->andWhere('mc.id = :member')
->orderBy('mli.eventDate', 'DESC')
->setParameters(array(
'centre' => $centreid,
'member' => $member
));
答案 3 :(得分:0)
查看此处的示例 - http://docs.doctrine-project.org/en/latest/reference/dql-doctrine-query-language.html
将id用作参数的所有地方都用作整数。在数据库中,id始终是一个整数。 Doctrine需要您的$ member作为整数,而您传递的是数字字符串。我假设Doctrine验证参数的代码部分有某种类型的错误。我建议您在freenode上的#doctrine频道报告此错误。
作为代码的解决方案,只需在查询中使用intval($ member)或(int)$ member对$ member变量进行类型转换。