2

こんにちは、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 . '%';

}

しかし、私はそれを行う正しい方法を理解できません。

編集 (12/11/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 を使用することについては言及されていません。tableGateway 内で高度な where 句を使用する例はありません。私はおそらく何かを見逃していますが、それは明らかではないと思います。

4

1 に答える 1

11

なぜ人々は公式文書を無視しているのでしょうか? 簡単な例は次のようになります。

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

ただし、select() 関数に type の引数を与えることができますZend\Db\Sql\Where。ここでも、公式ドキュメントのこの部分が大いに役立ちます。次のようなよりクリーンなコードをWhere実行できます。

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

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

これが少し役立つことを願っています。ドキュメントを無視しないでください!;)

于 2012-11-12T06:29:01.687 に答える