1

Zend は初めてですが、PHP やその他の MVC フレームワークには精通しています。クライアントは Zend をアプリケーションに使用する必要があり、気に入ったデータベース アプローチを見つけるのに少し苦労しています。私は1つのデータベース(現在はMySQL、本番環境ではMS SQL)にのみ接続しており、実際には1つのテーブルとしかやり取りしていません。そうは言っても、そのデータベースへのハンドルを開き、開いたままにして、すべてのコントローラーで使用できるようにし、fetchAll、fetchOne などのメソッドを使用できるようにするための適切な方法を見つけたいと思います。

理想的には、コントローラーから以下のような呼び出しを行い、結果をビューに渡すことができるようにしたいと考えています。

$this->db->fetchAll("SELECT * FROM TABLE"); 

Zend サイトのチュートリアルに従いましたが、Zend_Db_Table アプローチを使用した後、必要な柔軟性を見つけることができなかったため、ここの誰かが私を別の方向に向けてくれることを望んでいます。Zend データベース モデルが Zend コントローラーとどのように相互作用するかについて頭を悩ませているようですが、確かな情報を提供できる SO ユーザーがたくさんいると確信しています。

前もって感謝します!

4

3 に答える 3

1

この設定を application.ini に入れると、Zend はクエリを実行しようとするとデータベースへの接続を確立します (一部はオプションです)。

resources.db.adapter = "pdo_mysql"
resources.db.params.host = "[host_address]"
resources.db.params.username = "[db_username]"
resources.db.params.password = "[db_password]"
resources.db.params.dbname = "[db_name]"
resources.db.isDefaultTableAdapter = true
resources.db.params.charset = "utf8"
resources.db.params.driver_options.1002 = "SET NAMES utf-8"


データベースにクエリを実行するには、Zend モデルを使用するのが最適です。たとえば、次のようなモデルを定義します。

class Application_Model_Book extends Zend_Db_Table_Abstract{
    public function getBookById($id){
        $this->find($id); を返します。
    }
}


そして、次のようにコントローラーで使用します。

$mBook = 新しい Application_Model_Book();
$myBook = $mBook->getBookById(5);



もちろん、これは簡単な例であり、コントローラーで簡単に作成できます。ただし、より複雑なクエリの場合、コードを大幅に整理してクリーンアップします。http://framework.zend.com/manual/1.11/en/zend.db.select.htmlを読み、モデルで知識を使用してください。

于 2012-08-23T07:23:12.627 に答える
1

$this->db->fetchAll("SELECT * FROM TABLE");実際にはかなり簡単に達成できます。

application.ini または bootstrap.php でデータベース アダプターを既にセットアップしていると仮定します。アダプターをどこかに定義している限り、どちらでも構いません。

//simplified for demonstration
class SomeController extends Zend_Controller_Action

    protected $db;

    //items that are put into init() or predispatch() or similar function 
    //can usually be put into a frontcontroller plugin if needed app wide.
    public function init() {
        //this works as long as you have only one adapter defined or have set one as default.
        $this->db = Zend_Db_Table::getDefaultAdapter();
    }
    public function indexAction() {
        //with your db adapter defined you have access to the api for Zend_Db_Table_Abstract
        $result = $this->db->fetchRow($sql);
        //while a simple string will work as $sql I would
        //recommend the select() be used if for not other reason then that
        //the queries are built programatically
        $select = $this->db->select();
        $select->where('id = ?', $id)->orWhere('role = ?', 1); //selects can be chained or separated
        $select->order('id','ASC');

        $rows = $this->db->fetchAll($select);//returns rowset object, toArray() if needed.

    }
}

ほとんどの人がZend_Dbを初めて使用するときに直面する最大の問題は、どの方法が最適かを判断することだと思います。このコンポーネントを使用するには多くの方法があり、ほとんどの人は気に入ったものを見つけて、あらゆる用途に使用しています。

たとえば、サンプル コードのように 、単純な SQL クエリをselect() オブジェクト$sql = "SELECT * FROM TABLE";
として文字列として表すことができます。Zend_Db_Exprを使用して、より複雑な式を表すことができます。また、 Zend_Db_Statementを忘れないでください(これは使用したことがないため、正しくデモできません)。
$select->where(new Zend_Db_Expr("FIND_IN_SET('$genre', genre)"));

必要に応じて、値と識別子を引用できます。
[編集]

前に述べたように、データベース アダプターを定義する必要があります。私は自分のapplication.iniでこれを行うことを好みますが、Bootstrap.phpもアダプターを定義する一般的な場所です。

application.iniに、少なくとも次の行があることを確認してください。

resources.db.adapter = "pdo_Mysql" //or your chosen adapter
resources.db.params.username = "username"
resources.db.params.password = "password"
resources.db.params.dbname = "dbname"

少なくとも、これがあなたの方向性を示してくれることを願っています。頑張ってください!

于 2012-08-23T09:13:47.077 に答える
0

Zend モデルはコントローラーをまったく知らないことに注意してください。これは、MVC パターンの考え方の一部です。

あなたはあなたが探しているものに非常に近いようです。SQL ステートメントを使用してデータベースに直接クエリを実行する場合は、 Zend_DB->query() メソッドを参照してください。まさにあなたが求めていたものだと思います。 http://framework.zend.com/manual/en/zend.db.statement.html

しかし実際には、それを行うと、Zend_DB の多くのメリットが失われます。Zend_Select オブジェクトを使用してクエリを作成すると、テーブル/フィールド プレフィックスの自動補間、すべてのクエリのパラメータ化、結合などを取得できます。SQL->ORM の学習曲線を取得できれば、これらは非常に優れています。 http://framework.zend.com/manual/en/zend.db.select.html

何があっても、Zend のパラメーター化をクエリに必ず使用してください。そうしないと、DB レイヤーの優れたセキュリティ機能と安全機能をすべて捨てることになります。

于 2012-08-23T02:14:18.157 に答える