Неверное выражение PathExpression при попытке выполнить запрос

Не знаю, что еще можно попробовать.

Я получаю такую ​​ошибку:

[Семантическая ошибка] строка 0, столбец 10 рядом с 'idEntrada FROM': Ошибка: недопустимое выражение PathExpression. Должен быть StateFieldPathExpression.

Это мой запрос:

$query=$em->createQuery("SELECT mp.idEntrada FROM PAVPrimerAvisoBundle:ModeradoPor mp WHERE mp.idUsuario = $userId");

А это моя Сущность:

class ModeradoPor
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var integer
 *
 * @ORM\ManyToOne(targetEntity="User")
 * @ORM\JoinColumn(name="user", referencedColumnName="id")
 */
private $idUsuario;

/**
 * @var integer
 *
 * @ORM\ManyToOne(targetEntity="Entrada")
 * @ORM\JoinColumn(name="idEntrada", referencedColumnName="id")
 */
private $idEntrada;

/**
 * @var integer
 *
 * @ORM\Column(name="votacio", type="integer")
 */
private $votacio;

/**
 * Get id
 *
 * @return integer 
 */
public function getId()
{
    return $this->id;
}

/**
 * Set idUsuario
 *
 * @param integer $idUsuario
 * @return ModeradoPor
 */
public function setIdUsuario($idUsuario)
{
    $this->idUsuario = $idUsuario;

    return $this;
}

/**
 * Get idUsuario
 *
 * @return integer 
 */
public function getIdUsuario()
{
    return $this->idUsuario;
}

/**
 * Set idEntrada
 *
 * @param integer $idEntrada
 */
public function setIdEntrada($idEntrada)
{
    $this->idEntrada = $idEntrada;
}

/**
 * Get idEntrada
 *
 * @return integer 
 */
public function getIdEntrada()
{
    return $this->idEntrada;
}

/**
 * Set votacio
 *
 * @param integer $votacio
 */
public function setVotacio($votacio)
{
    $this->votacio = $votacio;
}

/**
 * Get votacio
 *
 * @return integer 
 */
public function getVotacio()
{
    return $this->votacio;
}

Если я сделаю этот запрос:

$query=$em->createQuery("SELECT mp FROM PAVPrimerAvisoBundle:ModeradoPor mp WHERE mp.idUsuario = $userId");

Or

$query=$em->createQuery("SELECT mp.id FROM PAVPrimerAvisoBundle:ModeradoPor mp WHERE mp.idUsuario = $userId");

работает отлично. Это просто с mp.idEntrada.

Есть ли опечатка в моей сущности?

Изменить: тоже бывает с mp.idUsuario.

РЕДАКТИРОВАТЬ: Например, я сбрасываю запрос mysql, и он отображается следующим образом (когда SELECT mp)

SELECT m0_.id AS id0, m0_.votacio AS votacio1, m0_.user AS user2, m0_.entrada_id AS entrada_id3 FROM ModeradoPor m0_ WHERE m0_.user = 5

Я также могу сделать SELECT mp.id

Но никогда не используйте mp.idEntrada / mp.idUser


person Reinherd    schedule 25.02.2013    source источник
comment
Ваша цель здесь - получить связанный объект Entrada (или entrada_id) вашей ModeradoPor сущности, где mp.idUsuario = $userId?   -  person cheesemacfly    schedule 26.02.2013
comment
Я не хочу получать объект целиком, только идентификатор. Но этот идентификатор - всего лишь внешний ключ Entrada Entity.   -  person Reinherd    schedule 26.02.2013
comment
Есть ли причина, по которой вы используете createQuery вместо чего-то вроде $em->getRepository('MyBundle:ModeradoPor')->find($id)?   -  person cheesemacfly    schedule 26.02.2013
comment
да, потому что этот запрос, который я сейчас отлаживаю, является лишь частью подзапроса.   -  person Reinherd    schedule 26.02.2013
comment
Если у вас все еще есть код из моего ответа, $query=$em->createQuery("SELECT mp.entrada_id FROM PAVPrimerAvisoBundle:ModeradoPor mp WHERE mp.idUsuario = $userId" ); должен работать, так ли это?   -  person cheesemacfly    schedule 26.02.2013
comment
Semantical Error] line 0, col 10 near 'entrada_id FROM': Error: Class PAV\PrimerAvisoBundle\Entity\ModeradoPor has no field or association named entrada_id . Похоже, что entrada_id - это не то поле для поиска. Вот почему я использую entrada, как я объявил, как private $entrada;. Может я ошибаюсь?   -  person Reinherd    schedule 26.02.2013
comment
Вы запускали php app/console doctrine:generate:entities MyBundle после изменения файла сущностей?   -  person cheesemacfly    schedule 26.02.2013
comment
Никогда не использовал эту команду. Я всегда использовал doctrine: schema: update ... В любом случае; я пытался, но: Generating entities for namespace "PrimerAviso" [RuntimeException] Namespace "PrimerAviso" does not contain any mapped entities.   -  person Reinherd    schedule 26.02.2013
comment
О, наконец-то смог использовать эту команду. В любом случае это все еще не работает. Та же ошибка. : Invalid PathExpression. Must be a StateFieldPathExpression.   -  person Reinherd    schedule 26.02.2013
comment
нашел это: stackoverflow.com/questions/14216470/ Помогает ли это?   -  person cheesemacfly    schedule 26.02.2013
comment
Проклятие. Я люблю тебя. Это работает: SELECT IDENTITY (mp.entrada). Кто-нибудь1 понимает, почему? В любом случае, @cheesemacfly, не могли бы вы опубликовать это как ответ, чтобы я мог отметить его как решенное? Спасибо!   -  person Reinherd    schedule 26.02.2013
comment
Вы сохранили определение Сущностей, как было предложено в моем ответе, или это не помогло? Я завершу свой ответ, но тот, у кого есть SELECT IDENTITY (mp.entrada), определенно заслуживает одобрения!   -  person cheesemacfly    schedule 26.02.2013
comment
Что ж, проблема вовсе не в этом. Я снова изменил свой код на оригинальный, и он работает. Проблема заключалась в том, что Выбрать IDENTITY. В остальном все было хорошо ^^   -  person Reinherd    schedule 26.02.2013
comment
Тогда мой ответ недействителен! Удаляю :)   -  person cheesemacfly    schedule 26.02.2013


Ответы (2)


SELECT IDENTITY (mp.entrada)FROM PAVPrimerAvisoBundle:ModeradoPor mp WHERE mp.idUsuario = $userId

Это решило проблему. Обратите внимание на "IDENTITY"

person Reinherd    schedule 27.02.2013
comment
Можете ли вы показать мне ссылку на документацию IDENTITY? Я искал это, но понятия не имею, что это такое и что искать, поэтому я нашел не связанные темы. Почему это работает сейчас? Заранее большое спасибо! - person NewRehtse; 26.11.2013
comment
Извините. Понятия не имею. Я где-то нашел ответ, но не официальную документацию. - person Reinherd; 26.11.2013
comment
Я нашел документацию по другому вопросу: Doctrine DQL выбирает примеры - person NewRehtse; 20.12.2013

Вам необходимо использовать определения FK вашей сущности, чтобы получить поле (свойство) PK.

Пример:

У меня есть сущности:

  • documentoDocumento (сущность со связями между документами)

  • documento (информация о документе с document_Type_Id FK)

  • documentTipo (объект ссылки с document_type_id -> (моя цель !!))

В объекте documentDocument:

/**
* @var Documento
*
* @ManyToOne(targetEntity="Documento")
* @JoinColumns({
*   @JoinColumn(name="documento2_id", referencedColumnName="id")
* })
*/
private $documento2;

В сущности документа:

/**
* @var DocumentoTipo
*
* @ManyToOne(targetEntity="DocumentoTipo")
* @JoinColumns({
*   @JoinColumn(name="documento_tipo_id", referencedColumnName="id")
* })
*/
private $documentoTipo;

В ТАБЛИЦАХ


[DocumentoDocumento]  -- table with some type of relations between documents
* id              pk
- documento1_id   fk  
- documento2_id   fk

[Documento]
*id               pk
-documento_tipo   fk  -- type of document
- blablabla

[DocumentoTipo]
*id               pk
-tipo                 -- type description
************************

Я хочу выбрать данные из DocumentoDocumento и показать типо из DocumentoTipo.

Это возвращает ошибку:

 $qb3 = $this->_em->createQueryBuilder();
$qb3->select('dd.id, dd.documento, d2.contenidoTipo')
  ->from('Mnc\Entity\DocumentoDocumento', 'dd')    // select from DocumentoDocumento
  ->innerJoin('dd.documento2','d2' );               // join to 'd2' 

но с:

$qb3 = $this->_em->createQueryBuilder();
$qb3->select('dd.id, dd.documento, dt2.tipo documentoTipo, dt2.id documentoTipoId')
  ->from('Mnc\Entity\DocumentoDocumento', 'dd') // select from DocumentoDocumento
  ->innerJoin('dd.documento2','d2' )            // join to 'd2'
  ->innerJoin('d2.documentoTipo', 'dt2');       // join FK in d2 to dt2

Я получаю dt2.id с псевдонимом documentoTipoId.

person wagagt    schedule 27.12.2013