Релационен API: where() не може да определи колоната, използвайки класове с пространство от имена

Опитвам се да направя нещо подобно

$u = \Entity\UserQuery::create()->where('User.Username = ?', "john")->findOne();

но получавам тази грешка

Не може да се определи колоната за обвързване към параметъра в клаузата „User.Username = ?“

Докато същият код в контекст без пространство от имена работи добре.

Знаех, че има по-добри начини да го направя, но искам да знам защо това се проваля


person Sapukay    schedule 02.09.2011    source източник


Отговори (2)


Добре известен проблем:

Най-добрият начин да разрешите проблема си е да използвате псевдоним:

$u = \Entity\UserQuery::create('alias')
    ->where('alias.Username = ?', "john")
    ->findOne();

Следният код също трябва да работи:

$u = \Entity\UserQuery::create('alias')
    ->where('Entity\UserQuery.Username = ?', "john") // or ->where('\Entity\UserQuery.Username = ?', "john")
    ->findOne();

Поздрави, Уилям

person William Durand    schedule 01.11.2011
comment
Любопитен съм защо сте използвали релационния API вместо класа ActiveQuery, т.е. просто \Entity\UserQuery::create()->filterByUserName('john')->findOne() щеше да се появи, тъй като това е проста заявка без никакви съединения и т.н. - person Qiniso; 06.02.2015

Посочването на третия параметър, тип обвързване, ми помогна:

$u = \Entity\UserQuery::create()
    ->where('alias.Username = ?', "john", \PDO::PARAM_STR)
    ->findOne();
person i--    schedule 21.11.2014