无法使用Symfony2中的变量检索记录,但如果我不使用变量,则有效吗?

时间:2013-09-12 17:37:10

标签: symfony doctrine-orm

我在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;
}

我无法弄明白,对我来说似乎很好。但显然有些事情阻止了这种做法。

4 个答案:

答案 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变量进行类型转换。