Выберите строку из набора строк в ZF2

Моя таблица выглядит примерно так

    id      uniqueId    userId  album
    1       1           1       Example
    2       2           1       Example
    3       1           2       Example
    4       3           1       Example
    5       2           2       Example

Я хотел бы найти название альбома, где userId => 1 и uniqueId => 3 (где id => 4, но у меня не будет доступа к этому, только два других).

Для этого я пытаюсь getAlbumsByUserId($userId) что вернет объект RowSet с альбомами пользователя 1. Затем я пытаюсь получить альбом из возвращенного набора строк с помощью uniqueId => 3

Что-то вроде приведенного ниже не будет работать
$albumObject = $albumTable->getAlbumsByUserId(1);
$row = $albumObject->select(array('uniqueAlbumID' => 3))->current();

Это функция, которая получает альбомы по идентификатору пользователя в виде набора строк.

public function getAlbumsByUserId($userId)
    {
        $userId     = (int) $userId;
        $rowset = $this->tableGateway->select(array('user_id' => $userId));

        return $rowset;
    }

Я мог бы выполнить foreach для объекта RowSet, чтобы найти уникальный идентификатор с помощью оператора if, но я должен думать, что есть лучший способ.

Редактировать:
Я до сих пор не нашел способ сделать выбор из набора результатов, но вы можете сделать 2, где условия в массиве выбора.


person Jordan    schedule 26.10.2013    source источник


Ответы (2)


Может быть, я не понимаю, чего именно вы хотите, но как насчет того, чтобы сделать оператор запроса с соединением, у вас есть хороший набор функций для выполнения этого в Zend.

В вашем AlbumTable.php:

public function getAlbum($userId, $uniqueAlbumId){
    $resultSet = $this->tableGateway->select()->where(array('userId = 1', 'uniqueId = 3'));
    $row = $resultSet->current();
    if(!$row){
         throw new Exception('No row found');
   }
    return $row;
}
person kilop    schedule 27.10.2013
comment
Похоже, это может быть то, что я ищу; присоединиться к внутренней. Я попробую. Спасибо :) - person Jordan; 27.10.2013
comment
После просмотра соединения выяснилось, что я могу использовать соединение только для соединения двух таблиц, а не двух наборов строк. Я обновил вопрос, указав формат моей таблицы и то, что я пытаюсь сделать. - person Jordan; 27.10.2013
comment
Возможно, попробуйте использовать «Где с И», если у вас есть оба числа. ВЫБЕРИТЕ альбом ИЗ youtable, ГДЕ userId = '1' AND uniqueId = '3'. - person kilop; 27.10.2013
comment
Я пробовал что-то вроде этого, но это не работает :(. $rowset = $this->tableGateway->select(array('userId' => $userId, 'uniqueId' => $uniqueId)); где массив - это оператор where - person Jordan; 27.10.2013
comment
попробуйте использовать оба метода tableGateway->select()->where(), как я написал в ответе выше. В моих проектах работает. - person kilop; 28.10.2013

Во-первых, я считаю, что возвращаемый набор строк является итератором, для которого вы можете использовать foreach и выполнять итерацию по каждой из строк. Однако, если вы хотите вернуть альбом с определенным значением идентификатора, вам нужно будет добавить функцию, например:

public function getAlbumById($id)
{
  $rowset = $this->tableGateway->select(array('id' => $id));
  $row = $rowset->current();
  return $row;
}

Вы можете проверить сайт ZF о tablegateway здесь: http://framework.zend.com/manual/2.0/en/modules/zend.db.table-gateway.html

а информация о RowSet находится здесь: http://framework.zend.com/manual/1.12/en/zend.db.table.rowset.html

person user2923958    schedule 26.10.2013
comment
Проблема в том, что я не могу искать по uniqueId, потому что он уникален для пользователя. Итак, мне нужно сначала получить альбомы для пользователя по их userId, а затем мне нужно выбрать() из них по uniqueId. - person Jordan; 27.10.2013