2017-06-22 15 views
0

私はCakePHP 3でアプリケーションを構築しています。これは、Cakeの規約では構築されていない多くのレガシーデータベースを使用しています。CakePHP 3 - カスタムSQLコードを置く場所

Cakeが提供するORM機能を使用したくないのですが、「Raw SQL」というだけでなく、すべての関係を設定するのが面倒です。また、データベース構造を変更することもないため、ORMは非スターターです。だから私はすべてのための生のSQLクエリを書くつもりです。

ただし、私は確信していませんここではこのコードが置かれます。私はhttps://book.cakephp.org/3.0/en/orm/database-basics.html#running-select-statementsを読んだことがありますが、実際にそのコードをどこに置くかは言いません。

MVCの目的を凌駕するので、コントローラにクエリを追加するのは理想的ではありません。

私が本当に必要とするのは、すべてのクエリを別の関数に入れて、それらをコントローラで参照できるモデルです。

ケーキ2.xでは、app/Model/の下にモデルを作成するだけで、コントローラーに必要な場所に(loadModel)をロードするのは簡単でした。しかし、新しいCake 3.x TableEntityのスペースでは、これはどのようにフィットするのか分かりません。

私はModelless Formsでも読んでいますが、どちらかが正しいとは思いません。例えば、アプリケーションの最初のページには、SELECTという文である化学物質のリストが表示されます。この段階では、フォームやユーザー入力は一切含まれていません。

明らかに、コントローラーからモデルにデータを渡す必要がある状況もあります。ユーザーの入力に基づいてクエリを実行します。

アドバイスをいただければ幸いです。

+1

も参照してください?あなたは構成作業のビットのために、ORMの力とそれに関連するすべてのものを捨てたいのですか?私にとって良い貿易、おそらくは貿易取引の歴史における最悪の貿易取引のようには思えません;)CakePHPは単なるPHPであり、好きな場所で好きなクラスを作ることができますモデル関連ロジックの適切な場所は、当然「モデル」名前空間になります。 – ndm

+0

@ndm、私はあなたの言うことに完全に同意します。私はそれを私が計画したやり方ではなく、約5つのデータベースを持っているアイデアを与えることを望んでいます - ケーキの慣行を使用していません。それぞれに約20のテーブルがあります。あなたは100以上のもののキーとリレーションの名前を書いていますか?または私は私の心の中でそれを複雑にしていますか?他のアプリケーションがコード化されているため、データベースレベルでは何も変更できません。したがって、すべてのモデルで定義する必要があります。たくさんのデータベース結合 - ORMを使用する方が簡単か、SQLを書くだけですか?それは私には難しいようです:) – Andy

+0

ちなみに、ファイルを置く場所の例(おそらく 'src/Model'にあります)と、ORM以外のやり方をしている場合、コントローラにロードする方法を教えてください。 – Andy

答えて

1

コメントに記載されているとおり、私はORMを捨てないことをお勧めします。それは非常に多くの利点があります。長期的にはおそらく残念です。

テーブルを設定することは大したことではありません。すべてを焼くことができ、リファクタリングを行うことができます。たとえば、参照とファイル名の名前を変更するという汚い作業を行い、手動でルールと関連付けを設定しますデータベーススキーマ、外部キー、および場合によってはアソシエーションのプロパティ名(これは可能なエンティティを更新する必要がある可能性があります。)に関して構成するのは、それほど多くなくてはいけないので、やや面倒かもしれません。注釈も) - 多分ここやそこにも条件やものがありますが、まあまあです。

言い換えれば、完全性のために、いつでもどこでも好きなロジックを作成することができます。 CakePHPは単なるPHPなので、Modelの名前空間(モデルに関連するロジックには当てはまります)のどこかにクラスを作成し、必要に応じて他のクラスと同じように使うことができます。

// src/Model/SomeModelRelatedClass.php 

namespace App\Model; 

class SomeModelRelatedClass 
{ 
    public function queryTheDatabase() 
    { 
     // ... 
    } 
} 
$inst = new \App\Model\SomeModelRelatedClass(); 
$results = $inst->queryTheDatabase(); 

本当に

関連する問題