ホームページ バックエンド開発 PHPチュートリアル CakePHP 2.x CookBook 中国語版 第 7 章 モデル - データの取得_PHP チュートリアル

CakePHP 2.x CookBook 中国語版 第 7 章 モデル - データの取得_PHP チュートリアル

Jul 14, 2016 am 10:08 AM
cakephp 1つ 中国バージョン データ 検索 モデル

データの取得

前述したように、モデル層の役割の 1 つは、さまざまなストレージからデータを取得することです。 CakePHP モデル クラスには、このデータの検索、並べ替え、ページネーション、フィルター処理に役立つ多くの機能が付属しています。使用する関数の多くは、モデルの Model::find() に統合されています
見つける
find(string $type = 'first', array $params = array())
Find は、すべてのモデル データ検索関数の主力機能です。 $type には、「all」、「first」、「count」、「list」、「neighbors」、「threaded」、または任意のカスタム検索タイプを指定できます。 $type では大文字と小文字が区別されることに注意してください。 大文字 (All など) を使用すると、期待した結果が得られません。
$params は、すべてのパラメータを別の検索に渡すために使用されます。デフォルトでは次のキー値があります。それぞれはオプションです。
1 配列(
2 '条件' => array('Model.field' => $thisValue), //条件の配列
3 '再帰' => 1, //int
;
4 'fields' => array('Model.field1', 'DISTINCT Model.field2'), //フィールド名の配列
5 'order' => array('Model.created', 'Model.field3 DESC'), //順序を定義する文字列または配列
6 'group' => array('Model.field'), //フィールドをGROUP BYに
7 'limit' => n, //int
8 'ページ' => n, //int
9 'オフセット' => n, //int
10 'callbacks' => true //その他の可能な値は false、'before'、'after' です
11)
検索タイプ、動作、独自のモデル メソッドに他のパラメーターを追加して使用することもできます。
find(「最初」)
find('first', $params) は結果を返します。結果が期待されるあらゆる状況で使用できます。 以下にいくつかの簡単な (コントローラー コード) 例を示します:
1 パブリック関数 some_function() {
2 // ...
3 $semiRandomArticle = $this->Article->find('first');
4 $lastCreated = $this->Article->find('first', array(
)
5 'order' => array('Article.created' => 'desc')
6 ));
7 $speciallyThisOne = $this->Article->find('first', array(
)
8 '条件' => array('Article.id' => 1)
9 ));
10 // ...
11 }
最初の例では、find に引数が渡されていないため、条件や並べ替えはありません。この形式の find('first') 呼び出しは次の形式を返します:
1 配列
2 (
3 [モデル名] => 配列
4 (
5 [id] => 83
6 7
8
9)
10
11 [関連モデル名] => 配列
12 (
13
14 [フィールド1] => 値1
15 [フィールド 2] => 値 2
16 [フィールド 3] => 値 3
17)
18)
find('count')
find('count', $params) は整数値を返します。以下にいくつかの簡単な (コントローラー コード) 例を示します:
1 パブリック関数 some_function() {
2 // ...
3 $total = $this->Article->find('count');
4 $pending = $this->Article->find('count', array(
)
5 '条件' => array('Article.status' => '保留')
6 ));
7 $authors = $this->Article->User->find('count');
8 $publishedAuthors = $this->Article->find('count', array(
)
9 'フィールド' => 'DISTINCT Article.user_id',
10 '条件' => array('Article.status !=' => '保留')
11));
12 // ...
13 }
メモ
フィールド配列を find('count') に渡さないでください。 DISTINCE カウントには列のみを指定できます (それ以外の場合、カウント結果は常に同じになります。条件に依存するだけです)。
検索(「すべて」)
find('all', $params) は結果の配列 (おそらく複数) を返します。
実際には、これはすべて find() の変形です (ページネーションを含む)。以下にいくつかの簡単な (コントローラー コード) 例を示します:
1 パブリック関数 some_function() {
2 // ...
3 $allArticles = $this->Article->find('all');
4 $pending = $this->Article->find('all', array(
)
5 '条件' => array('Article.status' => '保留')
6 ));
7 $allAuthors = $this->Article->User->find('all');
8 $allPublishedAuthors = $this->Article->User->find('all', array(
)
9 '条件' => array('Article.status !=' => '保留')
10));
11 // ...
12 }
メモ
上記の例では、$allAuthors には users テーブル内のすべてのユーザーが含まれます。適用する検索に条件は渡されません。
find('all') を呼び出した結果の形式は次のとおりです:
1 配列
2 (
3 [0] => 配列
4 (
5 [モデル名] => 配列
6 (
7 [id] => 83
8 [フィールド1] => 値1
9
10
11 )
12
13 [関連モデル名] => 配列
14 (
15 [id] => 1
16 [フィールド1] => 値1
17 [フィールド2] => 値2
18 [フィールド3] => 値3
19 )
20
21)
22)
find('リスト')
find('list', $params) はインデックス付き配列を返します。これは、HTML 入力フォームの選択要素などのリストが必要な場合に便利です。以下にいくつかの簡単な (コントローラー コード) 例を示します:
1 パブリック関数 some_function() {
2 // ...
3 $allArticles = $this->Article->find('list');
4 $pending = $this->Article->find('list', array(
)
5 '条件' => array('Article.status' => '保留')
6 ));
7 $allAuthors = $this->Article->User->find('list');
8 $allPublishedAuthors = $this->Article->find('list', array(
)
9 'fields' => array('User.id', 'User.name'),
10 '条件' => array('Article.status !=' => '保留'),
11 '再帰' =>
12 ));
13 // ...
14 }
メモ
上記の例では、$allAuthors には users テーブル内のすべてのユーザーが含まれます。適用する検索に条件は渡されません。
find('list') を呼び出した結果の形式は次のとおりです:
1 配列
2 (
3 //[id] => 'displayValue',
;
4 [1] => 'displayValue1',
5 [2] => 'displayValue2',
6 [4] => 'displayValue4',
7 [5] => 'displayValue5',
8 [6] => 'displayValue6',
9 [3] => 'displayValue3',
10)
find('list') を呼び出すとき、渡されたフィールド パラメーターを使用して、配列のキー、値、および (オプションで) 結果をグループ化するために何を使用するかを決定します。デフォルトでは、モデルの主キーがキーとして使用され、表示列が値として使用されます (モデルの displayField プロパティで構成できます)
いくつかの明確な例:
1 パブリック関数 some_function() {
2 // ...
3 $justusernames = $this->記事->ユーザー->find('list', array(
)
4 'フィールド' => array('User.username')
5 ));
6 $usernameMap = $this->Article->User->find('list', array(
)
7 'fields' => array('User.username', 'User.first_name')
8 ));
9 $usernameGroups = $this->Article->User->find('list', array(
)
10 'fields' => array('User.username', 'User.first_name', 'User.group')
11));
12 // ...
13 }
上記の例では、結果変数は次のようになります:
1 $justusernames = 配列
2 (
3 //[id] => 'ユーザー名',
4 [213] => 'AD7six'、
5 [25] => '_精神的_'、
6 [1] => 'PHPNut'、
7 [2] => 'グー'、
8 [400] => 'jperras',
9)
10
11 $usernameMap = 配列
12 (
13 //[ユーザー名] => '名',
14 ['AD7six'] => 'アンディ'、
15 ['_psychic_'] => 'ジョン'、
16 ['PHPNut'] => 'ラリー'、
17 ['グー'] => 'グー',
18 ['jperras'] => 'ジョエル',
19)
20
21 $usernameGroups = 配列
22(
)
23 ['ユーザー'] => 配列
24 (
)
25 ['PHPNut'] => 'ラリー'、
26 ['グー'] => 'グー'、
27)
28
29 ['管理者'] => 配列
30 (
)
31 ['_psychic_'] => 'ジョン'、
32 ['AD7six'] => 'アンディ'、
33 ['jperras'] => 'ジョエル'、
34)
35
36)
find(「スレッド」)
find('threaded', $params) は、モデル データのparent_id 列を使用して対応するネストされた結果を構築する場合、ネストされた配列を返します。以下にいくつかの簡単な (コントローラー コード) 例を示します:
1 パブリック関数 some_function() {
2 // ...
3 $allCatalog = $this->Category->find('threaded');
4 $comments = $this->Comment->find('スレッド', array(
)
5 '条件' => array('article_id' => 50)
6 ));
7 // ...
8 }
ヒント
ネストされたデータを処理するより良い方法は、ツリー動作を使用することです
上記の例では、$allCategories にはカテゴリ構造全体を表すネストされた配列が含まれます。 find('threaded') を呼び出した結果の形式は次のとおりです:
1 配列
2 (
3 [0] => 配列
4 (
5 [モデル名] => 配列
6 (
7 [id] => 83
8 [parent_id] => null
9
10 [フィールド 2] => 値 2
11 [フィールド 3] => 値 3
12)
13
14 [関連モデル名] => 配列
15 (
)
16
17 [フィールド1] => 値1
18 [フィールド2] => 値2
19 [フィールド3] => 値3
20)
21
22 [子] => 配列
23 (
)
24 [0] => 配列
25 (
26 [モデル名] => 配列
27 (
28 [id] => 42
29 [parent_id] => 83
30 [フィールド1] => 値1
31 [フィールド2] => 値2
32
33 )
34
35 [AssociatedModelName] => 配列
36 (
37 [id] => 2
38 [フィールド1] => 値1
39 [フィールド2] => 値2
40 [フィールド3] => 値3
41 )
42
43 [子] => 配列
44 (
45 )
46)
47 …
48)
49)
50)
結果の表示順序は注文処理の影響を受けるため変更される場合があります。 find('threaded') の引数として 'order' => 'name ASC' を渡すと、結果は name でソートされます。これと同様の順序はすべて使用できますが、このメソッドには、上位の結果が最初に返される組み込みの順序はありません。
警告
フィールドが指定されている場合は、parent_id (またはその現在のエイリアス) を含める必要があります:
1 パブリック関数 some_function() {
2 $categories = $this->Category->find('スレッド', array(
)
3 'フィールド' => array('id', 'name', 'parent_id')
4 ));
5 }
それ以外の場合、上記の例で返される配列は、期待されるネストされた構造になりません。
見つける(「隣人」)
find('neighbors', $params) は 'first' と同じ検索を実行しますが、リクエストの前後の行を返します。これは簡単な(コントローラーコード)例です:
1 パブリック関数 some_function() {
2 $neighbors = $this->Article->find('neighbors', array('field' => 'id', 'value' => 3));
3}
この例では、$params 配列にはフィールドと値の 2 つの要素が含まれています。検索内の他のすべての要素は引き続き使用できます (たとえば、モデルが包含可能である場合、$params で 'includes' を指定できます)。 find('neighbors') を呼び出した結果の形式は次のとおりです:
1 配列
2 (
3 [前] => 配列
4 (
5 [モデル名] => 配列
6 (
7 [id] => 2
8
9
10 …
11)
12 [関連モデル名] => 配列
13 (
14 [ID] = & gt;
15 [フィールド1] => 値1
16 [フィールド2] => 値2
17 …
18)
19)
20 [次] => 配列
21(
)
22 [モデル名] => 配列
23 (
) 24 [ID] = & gt;
25 [フィールド1] => 値1
26 [フィールド 2] => 値 2
27 …
28)
29 [関連モデル名] => 配列
30 (
) 31 [ID] = & gt;
32 [フィールド1] => 値1
33 [フィールド 2] => 値 2
34 …
35)
36)
37)
メモ
結果には常に 2 つのルート要素 (prev と next) のみが含まれることに注意してください。この関数は、モデルのデフォルトの再帰変数を尊重しません。再帰設定は、必要な各呼び出しにパラメータとして渡す必要があります。
カスタム検索タイプを作成する
find メソッドは柔軟で、カスタム検索を受け入れることができます。カスタム検索は、モデル変数で独自の型を定義し、モデル クラスで特定の関数を実装することによって行われます。
モデルの検索タイプは、検索オプションのショートカットです。たとえば、次の 2 つの検索は同じです:
1 $this->ユーザー->find('first');
1 $this->User->find('all', array('limit' => 1));
カーネル内の事前定義されたタイプは次のとおりです:
最初に
すべて
数える
リスト
ネジ付き
隣人
他のタイプはどうですか?たとえば、データベース内のすべての公開記事を検索するとします。各変更は、モデル内の Model::$findMethods 変数に型を追加することによって行われます。
1 クラス Article は AppModel を拡張します {
2 public $findMethods = array('available' => true);
3}
これは、CakePHP に、find 関数の最初のパラメーターとして使用可能な値を受け入れるように指示します。 2 番目のステップは、_findAvailable 関数を実装することです。 これは規則です。myFancySearch という検索を実装する場合は、_findMyFancySearch というメソッドを実装する必要があります。
1 クラスの記事は AppModel を拡張します {
2 public $findMethods = array('available' => true);
3
4 保護された関数 _findAvailable($state, $query, $results = array()) {
5 if ($state == 'before') {
6 $query['条件']['Article.published'] = true;
7 return $query;
8 }
9 $results を返します;
10 }
11 }
完全な例 (コントローラー コード) を次に示します:
1 クラス ArticlesController は AppController を拡張します {
2
3 // 公開されたすべての記事を検索し、作成された列によって並べ替えます
4 パブリック関数 Index() {
5 $articles = $this->Article->find('利用可能', array(
)
6 'order' => array('created' => 'desc')
7 ));
8 }
9
10 }
上記のコード内の特定の _find[Type] メソッドは 3 つのパラメーターを受け取ります。 1 つ目は、クエリの実行がその状態にあるときを意味し、前後の可能性があります。 これは、この関数がコールバック関数であり、完了前にクエリを編集したり、取得した結果を編集したりできるためです。
通常、最初に行うことは、検索関数のクエリステータスを確認することです。 before 状態は、クエリを編集し、新しい関係をバインドし、追加の動作を適用し、find に 2 番目の引数として渡された特殊キーを解釈したときの状態です。この状態では、$query パラメータが (変更されているかどうかにかかわらず) 返される必要があります。
後の状態は、結果を確認し、新しいデータを挿入し、計算して別の形式で返すか、最近返されたデータに対して任意の操作を行うことです。この状態では、$result 配列が (変更されているかどうかにかかわらず) 返される必要があります。
カスタム ルックアップを好きなだけ作成できます。これは、アプリケーション内のモデル間でコードを参加させる優れた方法でもあります。
次のタイプのカスタマイズを使用して検索をページ分割することもできます:
1 クラス ArticlesController は AppController を拡張します {
2
3 // 公開されたすべての記事はページ分割されます
4 パブリック関数 Index() {
5 $this->paginate = array('available');
6 $articles = $this->paginate();
7 $this->set(compact('articles'));
8 }
9
10 }
上記のようにコントローラーで $this->paginate 属性を設定すると、検索の種類が使用可能になり、検索結果を引き続き変更することもできます。
ページング数が間違っている場合は、ページング数を修正できる次のコードを AppModel に追加する必要がある場合があります。
1 クラス AppModel はモデルを拡張します {
2
3 /**
4 * カスタム検索のカウントクエリの「fields」キーが配列の場合は、それを削除します。
5 * Model::_findCount() 呼び出しを完全に中断するためです
6 *
7 * @param string $state 「前」または「後」のいずれか
8 * @param 配列 $query
9 * @param 配列 $results
10 * @return int 見つかったレコードの数、または false
11 * @access protected
12 * @see Model::find()
13*/
14 保護された関数 _findCount($state, $query, $results = array()) {
15 if ($state === 'before') {
16 if (isset($query['type']) && isset($this->findMethods[$query['type']])) {
17 $query = $this->{'_find' . ucfirst($query['type'])}('before', $query);
18 if (!empty($query['fields']) && is_array($query['fields'])) {
19
20 unset($query['fields']);
21 }
22 }
23 }
24 }
25 returnparent::_findCount($state, $query, $results);
26 }
27
28 }
29 ?>
バージョン2.2で変更されました。
カウント結果のエラーを修正するために _findCount をオーバーライドする必要はもうありません。 カスタム ルックアップの「前」の状態が $query['operation'] = 'count' で再度呼び出されるようになりました。返された $query は _findCount() で使用されます。 必要に応じて、「operation」キーをチェックすることで、別の $query を識別して返すことができます:
1 つの保護された関数 _findAvailable($state, $query, $results = array()) {
2 if ($state == 'before') {
3 $query['条件']['Article.published'] = true;
4 if (!empty($query['operation']) && $query['operation'] == 'count') {
5 return $query;
6 }
7 $query['joins'] = array(
8 //必要な結合の配列
9 );
10 return $query;
11 }
12 $results;
13 }
マジック検索タイプ
これらのマジック関数は、特定の列に基づいてテーブルを検索するためのショートカットです。これらの関数の末尾に列名 (キャメルケース形式) を追加し、最初の引数としてそれらの列のルールを指定するだけです。
findAllBy() 関数は find('all') と同様の形式で結果を返しますが、findBy は find('first') と同じ形式で結果を返します。
すべて検索
findAllBy(string $value, array $fields, array $order, int $limit, int $page, int $recursive)
findAllBy 対応する SQL スニペット
$this->Product->findAllByOrderStatus('3'); Product.order_status = 3
$this->Recipe->findAllByType('Cookie'); Recipe.type = 'Cookie'
$this->User->findAllByLastName('Anderson'); User.last_name = 'Anderson'
$this->Cake->findAllById(7); Cake.id = 7
$this->User->findAllByEmailOrUsername('jhon'); User.email = 'jhon' OR User.username ='jhon';
$this->User->findAllByUsernameAndPassword('jhon', '123'); User.username = 'jhon' ANDUser.password = '123';
$this->User->findAllByLastName('psychic', array(),array('User.user_name => 'asc')); User.last_name = 'psychic' ORDER BYUser.user_name ASC
返される結果の配列の形式は、find('all') の戻り値の形式と似ています。
探す
findBy<フィールド名>(string $value);
findBy マジック関数は、いくつかのオプションのパラメーターも受け入れます:
findBy(string $value[,mixed $fields[,mixed $order]]);
findBy の例 対応する SQL スニペット
$this->Product->findByOrderStatus('3'); Product.order_status = 3
$this->Recipe->findByType('Cookie'); Recipe.type = 'Cookie'
$this->User->findByLastName('Anderson'); User.last_name = 'Anderson';
$this->User->findByEmailOrUsername('jhon'); User.email = 'jhon' OR User.username = 'jhon';
$this->User->findByUsernameAndPassword('jhon','123'); User.username = 'jhon' AND User.password ='123';
$this->Cake->findById(7); Cake.id = 7
findBy() 関数は、find('first') と同様の結果を返します。
モデル::クエリ()
クエリ(文字列 $クエリ)
必要になることはほとんどありませんが、他のメソッドを通じて SQL を呼び出すことができない、または呼び出したくない場合は、モデルの query() メソッドを直接使用できます。
実際にアプリケーションでこのアプローチを使用したい場合は、CakePHP のデータ クレンジングを必ず読んでください。これは、ユーザーが指定したデータをクリーンアップして、インジェクションやクロスサイト スクリプティング攻撃を防ぐのに役立ちます。
メモ
query() は $Model->cacheQueries を無視します。これは、その機能が呼び出し元のモデルとは本質的に無関係であるためです。呼び出したクエリのキャッシュを回避するには、2 番目のパラメーターを false に設定します (例: query($query, $cachequeries = false))。
query() は、モデル名ではなく、クエリ内のテーブル名を返されるデータの配列キーとして使用します。例:
1 $this->Picture->query("SELECT * FROM photos LIMIT 2;");
次の配列を返す場合があります:
1 配列
2 (
3 [0] => 配列
4 (
5 [写真] => 配列
6 (
7 [id] => 1304
8 [user_id] => 759
9)
10)
11
12 [1] => 配列
13 (
14 [写真] => 配列
15 (
) 16 [ID] = >1305
17 [ユーザーID] => 759
18)
19)
20)
find メソッドの戻り結果と一貫性を保つためにモデル名を配列キーとして使用するには、クエリを次のように記述できます:
1 $this->Picture->query("SELECT * FROM photos AS Picture LIMIT 2;");
が返されます:
1 配列
2 (
3 [0] => 配列
4 (
5 [画像] => 配列
6 (
7 [id] => 1304
8 [user_id] => 759
9)
10)
11
12 [1] => 配列
13 (
14 [画像] => 配列
15 (
) 16 [ID] = >1305
17 [ユーザーID] => 759
18)
19)
20)
メモ
この構文と連想配列構造は MySQL でのみ有効です。 Cake はクエリを手動で実行するときに抽象データを提供しないため、結果はデー​​タベースによって異なります。
モデル::フィールド()
フィールド(文字列 $name, 配列 $conditions = null, 文字列 $order = null)
戻り値は、$order で指定されたソート条件に一致する最初のレコードの $name で指定された 1 つの列のみです。条件が渡されず、モデルに ID が設定されている場合は、現在のモデル結果の列の値が返されます。一致するレコードがない場合、検索は false を返します。
1 $this->Post->id = 22;
2 echo $this->Post->field('name') // 行 ID 22 の名前をエコーし​​ます
3
4 echo $this->Post->field('name', array('created <' => date('Y-m-d H:i:s')), 'created DESC');
5 // 最後に作成されたインスタンスの「名前」列を表示します。
モデル::read()
読み取り($fields, $id)
read() は、現在のモデル データ (Model::$data) を設定するために使用されるメソッドです (編集中など) が、データベースから単一のレコードがフェッチされる他の状況では使用できません
$fields は単一の列の名前を渡すために使用されます。これは文字列または列名の配列にすることができ、空の場合はすべての列が取得されます。
$id は、読み取るレコードの ID を指定します。デフォルトは、Model::$id で指定された現在選択されているレコードです。 $id に別の値を渡すと、レコードが選択されます。
read() は常に配列を返します (列名が 1 つしか含まれていない場合でも)。 field を使用して、単一の列の値を取得します。
警告
read メソッドはモデルの data 属性と id 属性に保存されている情報を上書きするため、この関数を使用するとき、特に beforeValidata や beforeSave などのモデル コールバック関数で使用するときは十分に注意してください。一般に、find メソッドは、read メソッドよりも強力で使いやすい API を提供します。
複雑な検索条件
ほとんどのモデルの検索呼び出しでは、条件セットを渡す必要があります。通常、CakePHP は配列を使用して、SQL クエリの WHERE 句に配置する必要がある条件を結合します。
配列の操作はすっきりしていて読みやすく、クエリの構築は非常に簡単です。この構文は、クエリ内の要素 (列、値、演算など) も分割します。これにより、CakePHP がより効率的なクエリを生成できるようになり、SQL 構文が正しく、クエリの個々の部分が正しく分解されることが保証されます。配列構文を使用すると、CakePHP はクエリが SQL インジェクション攻撃から安全であることを保証することもできます。
配列に基づく最も基本的なクエリは次のようになります:
1 $conditions = array("Post.title" => "これは投稿です", "Post.author_id" => 1);
2 // モデルを使用した例
3 $this->Post->find('first', array('conditions' => $conditions));
この構造は非常に単純です。「これは投稿です」というタイトルの投稿が検索されます。列名として「タイトル」を使用することもできますが、コードの明瞭さが向上し、スキーマを変更する場合の競合を防ぐことができるため、クエリを構築するときは常にモデル名を指定することをお勧めします。
他のマッチタイプについてはどうですか?同様に簡単です。タイトルが「This is a post:
」ではないすべての投稿を検索したいとします。
1 array("Post.title !=" => "これは投稿です")
「!=」が列名の後に続くことに注意してください。 CakePHP は、列名と演算子をスペースで区切っている限り、LIKE、BETWEEN、REGEX を使用した一致式を含む、有効な SQL 比較演算子を解析できます。 IN(...) スタイルの一致例外。タイトルが指定された値セット内にある投稿を検索するとします。
1配列(
2 "Post.title" => array("最初の投稿", "2番目の投稿", "3番目の投稿")
3)
NOT IN(...) マッチングを実行して、タイトルが指定された値セット内にない投稿を検索するには:
1配列(
2 "NOT" => array("Post.title" => array("最初の投稿", "2 番目の投稿", "3 番目の投稿"))
3)
条件に追加のフィルタリングを追加することは、配列に追加のキーと値のペアを追加するのと同じくらい簡単です:
1 配列 (
2 "Post.title" => array("最初の投稿", "2 番目の投稿", "3 番目の投稿"),
3 "Post.created >" => date('Y-m-d', strtotime("-2 週間"))
4)
データベース内の 2 つの列を比較するルックアップを作成することもできます:
1 配列("Post.created = Post.modified")
上記の例は、作成時刻と編集時刻が同じ投稿 (つまり、一度も編集されていない投稿) を返します。
メソッド (論理演算など) で WHERE 句を生成できない場合は、文字列を使用していつでも WHERE 句を指定できることを覚えておいてください。
1配列(
2 'Model.field & 8 = 1',
3 // その他の一般的な条件
4)
デフォルトでは、CakePHP は論理 AND を使用して複数の条件を接続します。つまり、上記のスニペットは、2 週間前に作成され、指定されたセットの 1 つに一致するタイトルを持つ投稿にのみ一致します。ただし、いずれかの条件を満たす投稿を簡単に見つけることもできます:
1 array("OR" => array(
2 "Post.title" => array("最初の投稿", "2 番目の投稿", "3 番目の投稿"),
3 "Post.created >" => date('Y-m-d', strtotime("-2 週間"))
4))
CakePHP は、AND、OR、NOT、XOR などを含むすべての有効な SQL 論理演算を受け入れ、大文字と小文字は区別されません。これらの条件は制限なくネストできます。投稿と作成者の間に帰属する関係があり、特定のキーワード (「マジック」) を含む投稿、または 2 週間前に作成された (ただしボブのみが作成した) すべての投稿を検索したいとします。
1配列(
2 "著者名" => "ボブ",
3 "OR" => 配列(
4 "Post.title いいね" => "%magic%",
5 "Post.created >" => date('Y-m-d', strtotime("-2 週間"))
6)
7)
同じ列に複数の条件を設定する必要がある場合、たとえば複数の用語で LIKE 検索を実行する場合は、次のような条件を使用できます:
1 array('OR' => array(
2 array('Post.title LIKE' => '%one%'),
3 配列('Post.title LIKE' => '%two%')
4))
Cake は null 列をチェックできません。この場合、クエリは null 以外のタイトルを持つすべてのレコードを返します:
1 array("NOT" => array(
2 "Post.title" => null
3)
4)
BETWEEN クエリを処理するには、次の条件を使用できます:
1 array('Post.read_count BETWEEN ? AND ?' => array(1,10))
メモ
CakePHP が引用する数値は DB のカラムタイプによって異なります。
グループ化?:
1配列(
2 'フィールド' => 配列(
3 'Product.type'、
4 '価格としてのMIN(Product.price)'
5)、
6 'グループ' => 'Product.type'
7)
戻り値の形式は次のとおりです:
1 配列
2 (
3 [0] => 配列
4 (
5 [製品] =>
6 (
7 [タイプ] => 衣類
8)
9 [0] => 配列
10 (
) C11 [価格] = & gt;
12)
13)
14 [1] => 配列
15 ...
DISTINCT クエリを実行する簡単な例を次に示します。 MIN()、MAX() などの他の演算子も同様の形式で使用できます。
1配列(
2 'fields' => array('DISTINCT (User.name) AS my_column_name'),
3 'order' = >array('User.id DESC')
4)
複数の条件配列をネストすることにより、非常に複雑な条件を構築できます:
1 配列(
2 'OR' => 配列(
3 array('Company.name' => 'Future Holdings'),
4 配列('Company.city' => 'CA')
5 )、
6 'AND' => 配列(
7 配列(
8 'OR' => array(
9 array('Company.status' => 'active'),
10 'NOT' => array(
11 array('Company.status' => array('inactive', 'suspended'))
12 )
13)
14)
15)
16)
対応する SQL クエリは次のとおりです:
1 `会社`.`id`、`会社`.`名前`、
を選択します
2 `会社`.`説明`、`会社`.`所在地`、
3 `会社`.`作成`、`会社`.`ステータス`、`会社`.`サイズ`
4
5 から
6つの「会社」AS「会社」
7どこ
8 ((`会社`.`名前` = 'フューチャーホールディングス')
9 または
10 (`会社`.`名前` = 'スティールメガワークス'))
11と
12 ((`会社`.`ステータス` = 'アクティブ')
13 OR (NOT (`会社`.`ステータス` IN ('非アクティブ', '一時停止'))))
サブクエリ
以下の例では、「id」、「name」、「status」列を持つ「users」テーブルがあることを前提としています。ステータスは「A」、「B」、「C」です。そして、サブクエリを使用して、ステータスが「B」とは異なるすべてのユーザーを取得したいと考えています。
これを実現するには、SQL ステートメントが返されることを除いて、find メソッドを呼び出しているのと同じように、モデル データ ソースを取得してクエリを構築するリクエストを行います。次に、式を生成し、条件配列に追加します。
1 $conditionsSubQuery['"User2"."status"'] = 'B';
2
3 $db = $this->User->getDataSource();
4 $subQuery = $db->buildStatement(
5 配列(
D 6 'フィールド' = & GT; 配列 ('"User2"."ID"'),
7 'テーブル' => $db->fullTableName($this->User),
8
9
10 'オフセット' =>
11 '結合' =>
12 '条件' => $conditionsSubQuery,
13 '注文' =>
14 'グループ' =>
15)、
16 $this->ユーザー
17 );
18 $subQuery = ' "ユーザー"."id" が入っていません (' . $subQuery . ') ';
19 $subQueryExpression = $db->e​​xpression($subQuery);
20
21 $conditions[] = $subQueryExpression;
22
23 $this->User->find('all', Compact('conditions'));
生成された SQL クエリは次のとおりです:
1選択
2 "User"."id" AS "User__id",
3 "ユーザー"."名前" AS "User__name",
4 "ユーザー"."ステータス" AS "User__status"
5 から
「ユーザー」として6人の「ユーザー」
7どこ
8 "ユーザー"."id" がありません (
9セレクト
10 "User2"."id"
11から
「User2」として 12 人の「ユーザー」
13 どこ
14 "ユーザー2"."ステータス" = 'B'
15)
また、上記の生の SQL クエリの一部を渡す必要がある場合、生の SQL を含むデータ ソース式はクエリのどの部分でも機能します。 www.2cto.com
準備されたステートメント
クエリをさらに制御する必要がある場合は、準備されたステートメントを使用できます。これにより、データベースドライバーと直接通信し、必要なカスタムクエリを渡すことができます:
1 $db = $this->getDataSource();
2 $db->fetchAll(
3 'ユーザー名 = ? かつパスワード = ? のユーザーから * を選択',
4 配列('ジョン', '12345')
5);
6 $db->fetchAll(
7 'ユーザー名 = :ユーザー名 AND パスワード = :パスワードのユーザーから * を選択',
8 array('ユーザー名' => 'ジョン','パスワード' => '12345')
9);

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/477780.html技術記事データの取得 前述したように、モデル層の役割の 1 つは、さまざまなストアからデータを取得することです。 CakePHP モデル クラスには、このデータの検索、並べ替え、ページネーションなどに役立つ多くの関数が付属しています。
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

CakePHP プロジェクトの構成 CakePHP プロジェクトの構成 Sep 10, 2024 pm 05:25 PM

この章では、CakePHP の環境変数、一般設定、データベース設定、電子メール設定について理解します。

世界で最も強力なオープンソース MoE モデルが登場。GPT-4 に匹敵する中国語機能を備え、価格は GPT-4-Turbo のわずか 1% 近くです 世界で最も強力なオープンソース MoE モデルが登場。GPT-4 に匹敵する中国語機能を備え、価格は GPT-4-Turbo のわずか 1% 近くです May 07, 2024 pm 04:13 PM

従来のコンピューティングを超える能力を備えているだけでなく、より低コストでより効率的なパフォーマンスを実現する人工知能モデルを想像してみてください。これは SF ではありません。世界で最も強力なオープンソース MoE モデルである DeepSeek-V2[1] が登場しました。 DeepSeek-V2 は、経済的なトレーニングと効率的な推論の特徴を備えた強力な専門家混合 (MoE) 言語モデルです。これは 236B のパラメータで構成されており、そのうち 21B は各マーカーをアクティブにするために使用されます。 DeepSeek67B と比較して、DeepSeek-V2 はパフォーマンスが優れていると同時に、トレーニング コストを 42.5% 節約し、KV キャッシュを 93.3% 削減し、最大生成スループットを 5.76 倍に高めます。 DeepSeek は一般的な人工知能を研究する会社です

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

MLP に代わる KAN は、オープンソース プロジェクトによって畳み込みまで拡張されました MLP に代わる KAN は、オープンソース プロジェクトによって畳み込みまで拡張されました Jun 01, 2024 pm 10:03 PM

今月初め、MIT やその他の機関の研究者らは、MLP に代わる非常に有望な代替案である KAN を提案しました。 KAN は、精度と解釈可能性の点で MLP よりも優れています。また、非常に少数のパラメーターを使用して、多数のパラメーターを使用して実行する MLP よりも優れたパフォーマンスを発揮できます。たとえば、著者らは、KAN を使用して、より小規模なネットワークと高度な自動化で DeepMind の結果を再現したと述べています。具体的には、DeepMind の MLP には約 300,000 個のパラメーターがありますが、KAN には約 200 個のパラメーターしかありません。 KAN は、MLP が普遍近似定理に基づいているのに対し、KAN はコルモゴロフ-アーノルド表現定理に基づいているのと同様に、強力な数学的基礎を持っています。以下の図に示すように、KAN は

超知性の生命力が覚醒する!しかし、自己更新 AI の登場により、母親はデータのボトルネックを心配する必要がなくなりました。 超知性の生命力が覚醒する!しかし、自己更新 AI の登場により、母親はデータのボトルネックを心配する必要がなくなりました。 Apr 29, 2024 pm 06:55 PM

世界は狂ったように大きなモデルを構築していますが、インターネット上のデータだけではまったく不十分です。このトレーニング モデルは「ハンガー ゲーム」のようであり、世界中の AI 研究者は、データを貪欲に食べる人たちにどのように餌を与えるかを心配しています。この問題は、マルチモーダル タスクで特に顕著です。何もできなかった当時、中国人民大学学部のスタートアップチームは、独自の新しいモデルを使用して、中国で初めて「モデル生成データフィード自体」を実現しました。さらに、これは理解側と生成側の 2 つの側面からのアプローチであり、両方の側で高品質のマルチモーダルな新しいデータを生成し、モデル自体にデータのフィードバックを提供できます。モデルとは何ですか? Awaker 1.0 は、中関村フォーラムに登場したばかりの大型マルチモーダル モデルです。チームは誰ですか?ソフォンエンジン。人民大学ヒルハウス人工知能大学院の博士課程学生、ガオ・イージャオ氏によって設立されました。

iPhoneのセルラーデータインターネット速度が遅い:修正 iPhoneのセルラーデータインターネット速度が遅い:修正 May 03, 2024 pm 09:01 PM

iPhone のモバイル データ接続に遅延や遅い問題が発生していませんか?通常、携帯電話の携帯インターネットの強度は、地域、携帯ネットワークの種類、ローミングの種類などのいくつかの要因によって異なります。より高速で信頼性の高いセルラー インターネット接続を実現するためにできることがいくつかあります。解決策 1 – iPhone を強制的に再起動する 場合によっては、デバイスを強制的に再起動すると、携帯電話接続を含む多くの機能がリセットされるだけです。ステップ 1 – 音量を上げるキーを 1 回押して放します。次に、音量小キーを押して、もう一度放します。ステップ 2 – プロセスの次の部分は、右側のボタンを押し続けることです。 iPhone の再起動が完了するまで待ちます。セルラーデータを有効にし、ネットワーク速度を確認します。もう一度確認してください 修正 2 – データ モードを変更する 5G はより優れたネットワーク速度を提供しますが、信号が弱い場合はより適切に機能します

アメリカ空軍が初のAI戦闘機を公開し注目を集める!大臣はプロセス全体を通じて干渉することなく個人的にテストを実施し、10万行のコードが21回にわたってテストされました。 アメリカ空軍が初のAI戦闘機を公開し注目を集める!大臣はプロセス全体を通じて干渉することなく個人的にテストを実施し、10万行のコードが21回にわたってテストされました。 May 07, 2024 pm 05:00 PM

最近、軍事界は、米軍戦闘機が AI を使用して完全自動空戦を完了できるようになったというニュースに圧倒されました。そう、つい最近、米軍のAI戦闘機が初めて公開され、その謎が明らかになりました。この戦闘機の正式名称は可変安定性飛行シミュレーター試験機(VISTA)で、アメリカ空軍長官が自ら飛行させ、一対一の空戦をシミュレートした。 5 月 2 日、フランク ケンダル米国空軍長官は X-62AVISTA でエドワーズ空軍基地を離陸しました。1 時間の飛行中、すべての飛行動作が AI によって自律的に完了されたことに注目してください。ケンダル氏は「過去数十年にわたり、私たちは自律型空対空戦闘の無限の可能性について考えてきたが、それは常に手の届かないものだと思われてきた」と語った。しかし今では、

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

See all articles