1

最近、Yii PHP MVC フレームワークを使い始めました。フレームワークを介してデータベースを操作し続ける方法についてのアドバイスを探しています。DB を処理するフレームワークの基本クラス CActiveRecord を使用する必要がありますか、または従来の SQL クエリ関数 (私の場合は mssql) を使用する必要がありますか?

明らかに、そうでなくても、古典的な SQL クエリを使用して DB を処理する方が簡単に思えますが、ある時点で、フレームワークの方法を使用することには利点があるはずだと思います。一部の SQL クエリはかなり頻繁にかなり複雑になります。フレームワークがどのように私を助け、物事を実際よりも複雑にしないのか理解できません。

4

5 に答える 5

2

Yii と大規模なデータベースに関する私の経験からの非常に一般的なルール:

次の場合に Yii Active Record を使用します。

  1. データベース内の 1 行から数行を取得して投稿したい (例: ユーザーが設定を変更する、ユーザーの残高を更新する、投票を追加する、オンラインのユーザー数を取得する、トピックの下の投稿数を取得する、モデルあり)
  2. テーブル間の階層モデル構造 (例: $user->info->email、$user->settings->currency) をすばやく設計して、使用ごとに表示される通貨/設定をすばやく調整できるようにしたい。

次の場合は、Yii Active Record から離れてください。

  1. 一度に数百件のレコードを更新したいと考えています。(モデルのオーバーヘッドが多すぎる)

    Yii::app()->db->command()  
    

    重いオブジェクトを回避し、単純な配列でデータを取得できます。

  2. 複数のテーブルを含む高度な結合とクエリを実行したい。

  3. 任意のバッチ ジョブ !! (例: 支払いテーブルをチェックして支払いが滞っている顧客を確認する、データベースの値を更新するなど)

私は Yii アクティブ レコードが大好きですが、アプリケーションの要件に基づいて、アクティブ レコード モデルとプレーン SQL (Yii::app()->db を使用) を交換しています。

最後に、単一ユーザーの通貨を更新するかどうかのオプションがあります

$user->info->currency = 'USD';
$user->info->save();

または、すべてのユーザーの通貨を更新する場合:

Yii::app()->db->command('UPDATE ..... SET Currency="USD" where ...');
于 2013-02-24T21:52:09.337 に答える
1

どの言語でも、データベースを扱う場合、フレームワークはデータベースの抽象化を提供することで役立ちます。

以下は、私が以前の開発期間中に何度も遭遇したことを知っているシナリオです。

  1. データベースを必要とするアプリケーションがあります。
  2. 私は大量のコードを書きます。
  3. SQL ステートメントを他のすべてのものと一緒にコードに入れました。
  4. データベースは何らかの形で変更されます。
  5. 私は戻って、すべての SQL ステートメントに 100 の変更を加えなければならないことに行き詰まっています。

とてもイライラします。

私が見つけた別のシナリオ:

  1. データベースに対して大量のコードを作成します。
  2. バグが入ってきます。バグがたくさんあります。私はそれらすべてを理解することはできません。
  3. コードのテストを書くように頼まれました。
  4. 私のコードはすべてデータベースの直接実装に依存しているため、これは不可能です。実際のコードを使用している場合、SQL ステートメントをどのようにテストしますか?

したがって、私のアドバイスは、データベースを抽象化できるフレームワークを使用することです。これにより、次の 2 つの大きなメリットが得られます。

  1. 後でデータベースを交換できる可能性があり、コードは同じままです! インターフェイスや何らかのフレームワークを使用している場合は、SQL ステートメントではなく、オブジェクトを直接扱っている可能性が高いです。特定の実装では、MySQL または SQL Server への書き込み方法がわかっている場合がありますが、通常、コードは「このオブジェクトを書き込みます」、「そのリストを読み取ります」と言うだけです。

  2. コードをテストできます!データを処理する優れたフレームワークでは、データベースをモックできるため、簡単にテストできます。

アプリケーションに SQL ステートメントを直接記述しないようにしてください。後で痛みを和らげます。

于 2013-02-05T19:01:02.370 に答える
0

Yii を使用する理由:

多くのモジュールがあり、モジュールごとにページネーション コードを記述する必要があると想像してみてください。昔ながらのスタイルで書くには、多くの時間が必要です。

なぜ Yii ClistView ウィジェットを使用しないのですか? ああ、このウィジェットにはおまけがあります。データ プロバイダーと、印刷しようとしている記事の存在の自動チェックです。

... Sphinx 検索エンジンからの結果で Yii CListView を使用する場合、結果が正しくない可能性があるため、ウィジェットは記事が実際に存在するかどうかをチェックします。

存在しない登録の検出コードを作成するのにどのくらいの時間がかかりますか?

また、さまざまなタイプのプロジェクトがある場合、メソッドを追加しますか?

いいえ!Yii がこれを行います。

コードを粗野なスタイルで書くのにどれくらいの時間がかかりますか? 作成、読み取り、更新、削除?

別のプロジェクトの古いコードを採用する予定はありますか?

Yii には Gii と呼ばれる奇跡のモジュールがあり、モデル、モジュール、フォーム、コントローラー、crud などを生成します。

最初は難しく感じるかもしれませんが、慣れてくると簡単です

于 2013-02-05T20:33:13.120 に答える
0

私は Yii に同梱されているデータベース システムに詳しくありませんが、最初は少し使ってみることをお勧めします。私の経験は、人気のある PHP ORM である Propel です。一般に、ORM システムにはテーブルごとに 1 つのクラスがあります (Propel にはテーブルごとに 3 つのクラスがあります)。

これで、ルックアップや結合などを行うための構文がおそらくあるでしょうが、最初にすべきことは、クエリで生の SQL を使用する方法を考え出すことです (CRUD 操作のいずれかに対して)。これらのクエリを実行するメソッドをモデル クラスに配置すると、少なくともコードの集中化の恩恵を受けることができます。

それが機能するようになったら、一度に学ばなければならない量の資料に圧倒されることなく、後で推奨されるアプローチに移行できます。Yii の学習 (特に、コントローラー間でコードを共有する方法と、保守可能なビュー テンプレートを作成する方法) にはしばらく時間がかかるため、他の多くのことで複雑にしすぎないようにするのが賢明かもしれません。

于 2013-02-05T20:23:16.897 に答える
0

CActiveRecord を使用することをお勧めします。多くの利点があります-

  1. 上記のように、yii 内で直接多くのウィジェットを使用できます (ページネーション、グリッドなど)。

  2. Yii ORM によって生成されるクエリは高度に最適化されています。

  3. SQL から抽出した結果を VO オブジェクトに入れる必要はありません。

  4. 何らかの理由でテーブルが変更された場合 (列の追加/削除、データ型の変更)、yii が提供するツールを使用してモデルを再生成するだけで済みます。yii によって生成されたモデルでコードを変更しないようにしてください。 、これにより、マージの手間が省けます。

  5. 将来、DB を MYSQL から他のベンダーに変更する予定がある場合は、構成を変更するだけです。

  6. また、あなたとあなたのチームは貴重な開発時間を節約できます。

于 2013-02-22T06:57:22.760 に答える