Zend 2 — TableGateway Где пункты

Привет, я пытаюсь разобраться с Zend 2, и у меня возникли некоторые проблемы с предложениями where в шлюзе таблицы.

Ниже мой класс таблицы:

//module\Detectos\src\Detectos\Model\OperatingSystemTable.php
namespace Detectos\Model;

use Zend\Db\TableGateway\TableGateway;

class OperatingSystemsTable
{

    public function findOs($userAgent)
    {

        $resultSet = $this->tableGateway->select();

        foreach ($resultSet as $osRow)
        {
            //check if the OS pattern of this row matches the user agent passed in
            if (preg_match('/' . $osRow->getOperatingSystemPattern() . '/i', $userAgent)) {
                return $osRow; // Operating system was matched so return $oses key
            }
        }
        return 'Unknown'; // Cannot find operating system so return Unknown
    }
}

Модель такая:

class Detectos
{
    public $id;
    public $operating_system;
    public $operating_system_pattern;

    public function exchangeArray($data)
    {
        $this->id                       = (isset($data['id']))                              ? $data['id']                       : null;
        $this->operating_system         = (isset($data['operating_system  ']))              ? $data['operating_system  ']       : null;
        $this->operating_system_pattern = (isset($data['operating_system_pattern']))        ? $data['operating_system_pattern'] : null;

    }

    public function getOperatingSystemPattern()
    {
        return $this->operating_system_pattern;
    }
}

То, что у меня есть, работает, но я действительно должен быть в состоянии сделать что-то вроде:

public function findOs($userAgent)
{

    $resultSet = $this->tableGateway->select()->where('operating_system_pattern like %' . $userAgent . '%';

}

Но я не могу понять, как правильно это сделать.

Изменить (11.12.2012 07:53): я попробовал следующее из ответа Сэма, но получил ошибки:

$spec = function (Where $where) {
    $where->like('operating_system_type', '%' . $this->userAgent . '%');
};


$resultSet = $this->tableGateway->select($spec);

Но получил следующую ошибку:

Catchable fatal error: Argument 1 passed to Detectos\Model\OperatingSystemsTable::Detectos\Model\{closure}() must be an instance of Detectos\Model\Where, instance of Zend\Db\Sql\Select given.

Я также хотел бы добавить, что я прочитал документы и следовал руководству. Там нет упоминания об использовании Zend\Db\Sql. У меня нет примеров использования расширенных предложений where внутри tableGateway. Я, вероятно, что-то упускаю, но я не думаю, что это очевидно.


person Aydin Hassan    schedule 11.11.2012    source источник


Ответы (1)


Почему люди игнорируют официальную документацию? Простой пример будет таким:

$artistTable = new TableGateway('artist', $adapter);
$rowset = $artistTable->select(array('id' => 2));

Однако вы можете передать функции select() аргумент типа Zend\Db\Sql\Where. Опять же, эта часть официальной документации очень помогает . С помощью Where вы можете делать более чистый код, например:

$where = new Where();    
$where->like('username', 'ralph%');

$this->tableGateway->select($where)

Надеюсь, это поможет вам немного. Не игнорируйте документы! ;)

person Sam    schedule 12.11.2012
comment
Обновлено, по-видимому, где анонимная функция возвращает оператор выбора, а не объект Where, о котором я не знал. Хотя так должно работать - person Sam; 12.11.2012
comment
Нет, фатальная ошибка: класс 'Detectos\Model\Where' не найден. При попытке сделать: $where = new Where(); - person Aydin Hassan; 12.11.2012
comment
Вам нужно use Zend\Db\Sql\Where :S Извините, что не упомянул об этом явно - person Sam; 12.11.2012
comment
Спасибо. Сегодня проверю позже. Я использовал Zend\Db\Sql; Но не используйте Zend\Db\Sql\Where; - person Aydin Hassan; 12.11.2012
comment
Вам всегда нужно либо использовать явный класс, либо, если вы используете родительское пространство имен, вам придется сделать new Sql\Where(), что тоже сработает. - person Sam; 12.11.2012