доктрина 2 объединение ассоциаций не найдено

Я использую Doctrine-2.0.4 с Zend 1.11. Php Mappers и Entities генерируются из базы данных MySQL. Теперь я пытаюсь выполнить запрос, который объединяет две таблицы и получает только

[Semantical Error] строка 0, столбец 48 рядом с буквой «e»: Ошибка: Class Entities\Users не имеет ассоциации с именем Accounts

Запрос:

$query = $em->createQueryBuilder()
    ->select('u')
    ->from('\Entities\Users', 'u')
    ->leftJoin('u.Accounts', 'a')
    ->getQuery();
$info = $query->getResult();

В моей БД есть две таблицы: Пользователи, Аккаунты.

  • Пользователи имеют поля id, accountId
  • Аккаунты имеют поля id, info

Users.accountId имеет двунаправленную однозначную связь с Accounts.id.

<?php
namespace Entities;
/**
 * Users
 *
 * @Table(name="users")
 * @Entity
 */
class Users
{
    /**
     * @var integer $id
     *
     * @Column(name="id", type="integer", nullable=false)
     * @Id
     * @GeneratedValue(strategy="IDENTITY")
     */
    private $id;
   /**
     * @var integer $accountid
     *
     * @Column(name="accountId", type="integer", nullable=false)
     * @OneToOne(targetEntity="accounts", inversedBy="id")
     * @JoinColumn(name="accounts_id", referencedColumnName="id")
     */
    private $accountid;
...
}
<?php
namespace Entities;
/**
 * Accounts
 *
 * @Table(name="accounts")
 * @Entity
 */
class Accounts
{
    /**
     * @var integer $id
     *
     * @Column(name="id", type="integer", nullable=false)
     * @Id
     * @GeneratedValue(strategy="IDENTITY")
     * @OneToOne(targetEntity="users", mappedBy="accountid")
     */
    private $id;
...
}

person timt    schedule 17.04.2011    source источник


Ответы (2)


Вы должны изменить свойство $accountId объекта User на $accounts, потому что это не целое число, а объект Accounts:

/**
  * @var Accounts $accounts
  *
  * @Column(name="accountId", type="integer", nullable=false)
  * @OneToOne(targetEntity="Accounts", inversedBy="id")
  * @JoinColumn(name="accounts_id", referencedColumnName="id")
  */
private $accounts;

Ваш текущий запрос не работает, так как отсутствует свойство Accounts. Если вы внесете вышеуказанные изменения, следующее должно работать:

$query = $em->createQueryBuilder()
    ->select('u')
    ->from('\Entities\Users', 'u')
    ->leftJoin('u.accounts', 'a')
    ->getQuery();
$info = $query->getResult();
person rojoca    schedule 17.04.2011

Вы не можете использовать одновременно @Column и @JoinColumn.

Вы должны удалить строку @Column, и она должна работать!:

/**
  * @var Accounts $accounts
  *
  * @OneToOne(targetEntity="Accounts", inversedBy="id")
  * @JoinColumn(name="accounts_id", referencedColumnName="id")
  */
private $accounts;
person Almog Baku    schedule 04.04.2014
comment
Пара часов отладки и пара секунд, чтобы найти ответ. 10nx - person Igor Vizma; 23.06.2014