получить идентификатор для другой таблицы в Symfony - PullRequest
1 голос
/ 28 июня 2011
table: USERS
| id | name | city_id |
| 1  | jonh |  1      |
table: CITY
| id | city_ name |
| 1  | London |

в действии.класса:

$this->user_list = Doctrine::getTable('Users')
      ->createQuery('a')
      ->execute();

и это генерирует:

$user_lists->getId();
$user_lists->getName();
$user_lists->getCityId();


| 1 | john | 1 |

как я могу сделать:

| 1 | jonh | London |

?

я делаю в UsersTableClass:

public function getCityName($id) {

        $q = $this->createQuery('j')
        ->select('u.name, c.city_name')
        ->from('Users u')
        ->where('city_id = ?', $id)
        ->leftJoin('u.city c');

        return $q->fetchOne();   
}


$user_lists->getId();
$city_name;
$user_lists->getCityId();

и в action.class:

$this->user_list = Doctrine::getTable('Users')
      ->createQuery('a')
      ->execute();
$this->city_name = Doctrine::getTable('Users')->getCityName($this->user_list->getCityId());

тогда у меня ошибка:

Неустранимая ошибкаВызов неопределенного метода Doctrine_Collection :: getCityId ()

Ответы [ 2 ]

1 голос
/ 28 июня 2011

Причина, по которой вы получаете ошибку, заключается в том, что вы вызываете getCityId() для класса коллекции: выполняемый вами запрос (SELECT * FROM users....) возвращает нескольких пользователей, поэтому это коллекция.Вы должны пройтись по результатам, чтобы получить отдельные результаты.Если вы ожидаете, что запрос вернет только один результат, вы можете использовать fetchOne() вместо execute() в своем запросе.

Вы можете ссылаться на связанные записи только по имени их отношения.

$this->user_list = Doctrine::getTable('Users')
      ->createQuery('u')
      ->leftJoin('u.City');  // <-- Added for performance
      ->execute();

foreach($this->user_list as $user) {
  $id = $user->id;                // is the same as $user->getId()
  $name = $user->name;            // == $user->getName(); 
  $cityName = $user->City->name;  // == $user->getCity()->getName();
}
0 голосов
/ 28 июня 2011
return $q->execute()->getFirst();  

вместо

return $q->fetchOne();
...