前回の記事では、クエリ言語の使用方法について詳しく説明しましたが、クエリ言語はクエリまたは操作条件の問題を解決するだけであり、より多くの連携を行うには、モデルが提供する一貫した操作メソッドを使用する必要があります。
はじめに
コヒーレント操作により、コードの明瞭さとデータ アクセスの開発効率が効果的に向上し、すべての CURD 操作がサポートされます。これは、ThinkPHP の ORM のハイライトでもあります。使用方法も比較的簡単です。ステータス 1 を満たす User テーブルの最初の 10 レコードをクエリし、ユーザーの作成時間に従って並べ替えたい場合、コードは次のようになります。
$User->where('status=1')->order('create_time')->limit(10)->select();-
ここでの where、order、limit メソッドは、コヒーレント操作メソッドと呼ばれます。ただし、select メソッドは最後に配置する必要があります (select メソッドはコヒーレント操作メソッドではないため)。たとえば、連続操作のメソッドの呼び出し順序は順番ではありません。 、次のコードは上記と同等です:
$User->order('create_time')->limit(10)->where('status=1')->select();-
実際、コヒーレントな操作を使用できるのはクエリ メソッドだけではなく、すべての CURD メソッドも使用できます。たとえば、次のようになります。
$User->where('id=1')->field('id,name,email')->find();
$User->where('status=1 and id=1')->delete();-
-
コヒーレント操作は、現在のクエリまたは操作に対してのみ有効です。完了後、コヒーレント操作に渡された値はすべて自動的にクリアされます (キャッシュ コヒーレント操作など、現在渡された値を記録する特殊なコヒーレント操作もあります)。 )。つまり、コヒーレントな操作の結果は後続のクエリには引き継がれません。
システムでサポートされているコヒーレントな操作方法は次のとおりです:
すべての一貫した操作は現在のモデル インスタンス オブジェクト (this) を返し、* のマークが付いた操作は複数の呼び出しをサポートします。
使用法
コヒーレント操作の使用には複数のメソッドの併用が含まれることが多いため、各コヒーレント操作の基本的な使用法を以下に簡単に紹介します。
どこ
where 用于查询或者更新条件的定义 |
用法 |
where($where) |
参数 |
where(必须):查询或者操作条件,支持字符串、数组和对象 |
返回值 |
当前模型实例 |
备注 |
如果不调用where方法,默认不会执行更新和删除操作 |
Where メソッドは最も一般的に使用されるコヒーレント操作メソッドです。詳細な使用法については、「クイック スタート (3) クエリ言語」を参照してください。
テーブル
table 定义要操作的数据表名称,动态改变当前操作的数据表名称,需要写数据表的全名,包含前缀,可以使用别名和跨库操作 |
用法 |
table($table) |
参数 |
table(必须):数据表名称,支持操作多个表,支持字符串、数组和对象 |
返回值 |
当前模型实例 |
备注 |
如果不调用table方法,会自动获取模型对应或者定义的数据表 |
使用例:
$Model->Table('think_user user')->where('status>1')->select();-
テーブル メソッドでライブラリ間の操作を実行することもできます。例:
$Model->Table('db_name.think_user user')->where('status>1')->select();-
Table メソッドのパラメーターは、配列モードでの文字列と配列の使用をサポートしています:
$Model->Table(array('think_user'=>'user','think_group'=>'group'))->where('status>1')->select();-
配列定義を使用する利点は、テーブル名とキーワード間の競合によるエラーを回避できることです。
通常の状況では、テーブル メソッドを呼び出す必要はありません。現在のモデルに対応する、または現在のモデルによって定義されたデータ テーブルがデフォルトで自動的に取得されます。
データ
data 可以用于新增或者保存数据之前的数据对象赋值 |
用法 |
data($data) |
参数 |
data(必须):数据,支持数组和对象 |
返回值 |
当前模型实例 |
备注 |
如果不调用data方法,则会取当前的数据对象或者传入add和save的数据 |
使用例:
$Model->data($data)->add();-
$Model->data($data)->where('id=3')->save();-
Data メソッドのパラメーターはオブジェクトと配列をサポートします。オブジェクトの場合は、自動的に配列に変換されます。値を割り当てるデータ メソッドを定義していない場合は、create メソッドを使用するか、手動でデータ オブジェクトに値を割り当てることもできます。
データ オブジェクトの作成に加えて、モデルのデータ メソッドは現在のデータ オブジェクト
を読み取ることもできます。
例:
$this->find(3);-
$data = $this->data();-
フィールド
field は、クエリ対象のフィールドを定義するために使用されます
使用法 |
フィールド($フィールド,$例外=false) |
パラメータ |
field (必須): フィールド名。文字列と配列をサポートし、指定されたフィールド エイリアスをサポートします。true の場合、データ テーブルの明示的なフィールドまたはすべてのフィールドを意味します。
field 用于定义要查询的字段 |
用法 |
field($field,$except=false) |
参数 |
field(必须):字段名,支持字符串和数组,支持指定字段别名;如果为true则表示显式或者数据表的所有字段。
except(可选):是否排除,默认为false,如果为true表示定义的字段为数据表中排除field参数定义之外的所有字段。
|
返回值 |
当前模型实例 |
备注 |
如果不调用field方法,则默认返回所有字段,和field('*')等效 |
除外 (オプション): 除外するかどうか。デフォルトは false です。true の場合、定義されたフィールドは、フィールド パラメーター定義を除くデータ テーブル内のすべてのフィールドであることを意味します。
|
戻り値 |
現在のモデル インスタンス |
備考 |
フィールド メソッドが呼び出されない場合、デフォルトですべてのフィールドが返されます。これはフィールド ('*') と同等です。 |
テーブル>
使用例:
-
$Model->field('id,nickname as name')->select();
-
$Model->field(array('id','nickname'=>'name'))->select();
フィールド メソッドが呼び出されない場合、またはフィールド メソッドによって渡されたパラメーターが空の場合、フィールド ('*') を使用するのと同じです。
すべてのフィールドを明示的に渡す必要がある場合は、次のメソッドを使用できます:
-
$Model->field(true)->select();
ただし、明示的である必要があるフィールド名のみを取得するか、フィールド除外を使用してフィールド名を定義することをお勧めします。たとえば、
-
$Model->field('status',true)->select();
ステータスを除くすべてのフィールドを取得することを示します。
注文
order 用于对操作结果排序 |
用法 |
order($order) |
参数 |
order(必须):排序的字段名,支持字符串和数组,支持多个字段排序 |
返回值 |
当前模型实例 |
备注 |
如果不调用order方法,按照数据库的默认规则 |
使用例:
-
order('id desc')
並べ替え方法は複数のフィールドの並べ替えをサポートしています
-
order('ステータス説明,ID asc')
order メソッドのパラメータは文字列と配列をサポートしています。配列の使用法は次のとおりです。
order(array('status'=>'desc','id'))-
制限
limit 用于定义要查询的结果限制(支持所有的数据库类型) |
用法 |
limit($limit) |
参数 |
limit(必须):限制数量,支持字符串 |
返回值 |
当前模型实例 |
备注 |
如果不调用limit方法,则表示没有限制 |
注:limit メソッドが呼び出されない場合は、制限がないことを意味します
limit の使用法はデータベースの種類によって異なることはわかっていますが、ThinkPHP での使用法は常に統一されたメソッドです。つまり、Mysql、SqlServer、Oracle データベースのいずれであっても、これは limit('offset,length') です。 case を使用すると、システムのデータベース ドライバー クラスがこの違いを解決する役割を果たします。
使用例:
制限('1,10')-
以下の同等の記述方法を使用することもできます:
制限(1,10)-
を使用する場合
制限('10')-
に相当
制限('0,10')-
ページ
page 用于定义要查询的数据分页 |
用法 |
page($page) |
参数 |
page(必须):分页,支持字符串 |
返回值 |
当前模型实例 |
备注 |
无 |
ページ操作メソッドは、ページング クエリをより迅速に実行できる新機能です。
Page メソッドの使用法は limit メソッドと似ており、形式は次のとおりです:
Page('page[,listRows]')-
Page は現在のページ番号を表し、listRows は各ページに表示されるレコードの数を表します。例:
ページ('2,10')-
各ページに10件表示した場合、2ページ目のデータを取得することを示します。
次の記述は同等です:
ページ(2,10);-
listRow が書き込まれていない場合は、limit('length') の値が読み取られます。例:
制限(25)->ページ(3);-
各ページに25件表示した場合、3ページ目のデータを取得することを示します。
制限が設定されていない場合、デフォルトでは 1 ページあたり 20 レコードが表示されます。
ページ メソッドは、次のような 2 番目のパラメーターのサポートを追加します。
$this->page(5,25)->select();-
および以前の使用法
$this->limit('5,25')->select();-
同等。
グループ
使用例:
-
グループ('user_id')
Group メソッドのパラメータは文字列
のみをサポートします
を持っています
having 用于数据库的having查询支持 |
用法 |
having($having) |
参数 |
having(必须):having,支持字符串 |
返回值 |
当前模型实例 |
备注 |
无 |
使用例:
-
持つ('user_id>0')
メソッドのパラメータは文字列
のみをサポートします
参加する
join 用于数据库的join查询支持 |
用法 |
join($join) |
参数 |
join(必须):join操作,支持字符串和数组 |
返回值 |
当前模型实例 |
备注 |
join方法支持多次调用 |
使用例:
-
$Model->join(' work ON Artist.id = work.artist_id')->join('card ON Artist.card_id = Card.id')->select();
デフォルトでは LEFT JOIN メソッドが使用されます。他の JOIN メソッドを使用する必要がある場合は、
に変更できます。
-
$Model->join('artist.id = work.artist_id' で作品を右結合')->select();
join メソッドのパラメータが配列の場合、join メソッドは 1 回のみ使用でき、文字列メソッドと混合することはできません。
例:
-
join(array(' 作品 ON アーティスト.id = work.artist_id','カード ON アーティスト.card_id = カード.id'))
ユニオン
Union データベースの Union クエリのサポート
使用法 |
Union($union,$all=false) |
パラメータ |
Union (必須): Union 演算、文字列、配列、オブジェクトをサポートします
union 用于数据库的union查询支持 |
用法 |
union($union,$all=false) |
参数 |
union(必须):union操作,支持字符串、数组和对象
all(可选):是否采用UNION ALL 操作,默认为false |
返回值 |
当前模型实例 |
备注 |
Union方法支持多次调用 |
all (オプション): UNION ALL 操作を使用するかどうか。デフォルトは false です。 |
戻り値 |
現在のモデル インスタンス |
備考 |
Union メソッドは複数の呼び出しをサポートします |
テーブル>
使用例:
-
$Model->field('name')
-
->table('think_user_0')
-
->union('think_user_1 から名前を選択')
-
->union('think_user_2 から名前を選択')
-
->select();
数組使用法:
-
$Model->field('name')
-
->table('think_user_0')
-
->union(array('field'=>'name','table'=>'think_user_1'))
-
->union(array('field'=>name','table'=>'think_user_2'))
-
->select();
または
-
$Model->field('name')
-
->table('think_user_0')
-
->union(array('think_user_1 からの名前の選択','think_user_2 からの名前の選択'))
-
->select();
UNION ALL 操作をサポートします。例:
-
$Model->field('name')
-
->table('think_user_0')
-
->union('think_user_1 から名前を選択',true)
-
->union('think_user_2 から名前を選択',true)
-
->select();
または
-
$Model->field('name')
-
->table('think_user_0')
-
->union(array('think_user_1 からの名前の選択','think_user_2 からの名前の選択'),true)
-
->select();
各共用体メソッドは、独立した SELECT 句に相当します。
注意: UNION 内部の SELECT 句には同じ数の列が必要です。また、各 SELECT 句内の列の順序も同じである必要があります。
区別
使用例:
distinct 查询数据的时候进行唯一过滤 |
用法 |
distinct($distinct) |
参数 |
distinct(必须):是否采用distinct,支持布尔值 |
返回值 |
当前模型实例 |
备注 |
无 |
$Model->Distinct(true)->field('name')->select();
-
ロック
ロック方法は、データベースのロック機構であり、要求または操作の実行時に使用されます。
lock 用于查询或者写入锁定 |
用法 |
lock($lock) |
参数 |
lock(必须):是否需要锁定,支持布尔值 |
返回值 |
当前模型实例 |
备注 |
join方法支持多次调用 |
ロック(true)
-
最後に、生成された SQL 句で FOR UPDATE または FOR UPDATE NOWAIT (Oracle データベース) が自動的に追加されます。
検証
validate メソッドはデータの自動検証に使用されます。これについては、データ検証セクションで詳しく説明します。
自動
auto 用于数据自动完成 |
用法 |
auto($auto) |
参数 |
auto(必须):定义自动完成 |
返回值 |
当前模型实例 |
备注 |
auto方法只能配合create方法使用 |
auto メソッドは、データの自動補完操作に使用されます。具体的な使用方法については、データの自動補完のセクションで説明します。
範囲
scope 用于模型的命名范围 |
用法 |
scope($scope) |
参数 |
scope(必须):命名范围定义 |
返回值 |
当前模型实例 |
备注 |
scope方法其实是连贯操作的预定义 |
スコープメソッドの具体的な使用方法については、スコープ
という名前の 3.1 の新機能を参照してください。
フィルター
filter 用于数据的安全过滤 |
用法 |
filter($filter) |
参数 |
filter(必须):过滤方法名 |
返回值 |
当前模型实例 |
备注 |
filter方法一般用于写入和更新操作 |
filter メソッドは、データ オブジェクトの安全なフィルタリングに使用されます。例:
-
$Model->data($data)->filter('strip_tags')->add();
現在、フィルター メソッドは複数のメソッドによるフィルター処理をサポートしていません。
概要
コヒーレント操作はデータ操作に大きな利便性をもたらし、SQL で実現できる操作は基本的に ThinkPHP のコヒーレント操作で実装できれば、データベース間の表現の違いを考慮する必要がなく、移植可能です。変数の操作や取得方法については後ほど説明します。