コレクション
QueryExecuter
は結果に複数のアイテムが含まれる場合、コレクションを返します。コレクションは、PHPの配列のようにアクセスすることが可能です。さらに、以下のような便利なメソッドも用意されています:
getNativeArray()
insert(int $index, object $child)
add(object $childs)
remove(int $index)
renumber(string $fieldName)
move(int $index, int $destIndex)
delete()
save()
基本のアクセス
以下の基本のアクセスで説明するメソッドの処理はメモリ上でのみ行われ、データベースにはアクセスしません。
高速なループ
内部の配列を使ったループは、最も高速な処理ができます。内部配列はgetNativeArray
で取得します。
$customers = $qe->all();
$array = $customers->getNativeArray();
foreach($array as $obj) {
// (省略)
}
アイテムの追加
アイテムをコレクションの最後に追加します。
$customers = $qe->all();
$customer = new Customer();
$customer->id = 0;
$customer->name = 'Takeshi';
$customers->add($customer);
アイテムの挿入
アイテムを指定したインデックスに挿入します。
$customers = $qe->all();
$customer = new Customer();
$customer->id = 0;
$customer->name = 'Takeshi';
$customers->insert(0, $customer);
アイテムの削除
指定したインデックスのアイテムをコレクションから削除します。
$customers = $qe->all();
$customers->remove(1);
アイテムの移動
指定したインデックスのアイテムを指定した位置に移動します。
$customers = $qe->all();
$customers->move(0, $customers->count() - 1);
行番号の振り直し
オブジェクトが行番号を保持するプロパティを持っている場合、コレクション内の現在の順番で、行番号を振り直すことができます。この番号は1始まりです。
$customers = $qe->orderBy('name')->all();
$customers->renumber('row'); // 'row'プロパティは行番号を保持している
テーブルへの保存と削除
モデルのリレーションの結果として生成されたコレクションは、テーブルへの保存と削除を行うことができます。
以下のメソッドでは、コレクション内のアイテムをすべて一度に扱うことができます。
save
: コレクション内のアイテムをすべて一度に保存します。delete
: コレクション内のアイテムをすべて一度に削除します。
保存
保存時の動作は、メソッドの$options
パラメータ、またはコレクションの$saveOprions
プロパティで指定できます。
SAVE_AFTER_DELETE_ITEMS | DELETE_LOGICAL_ITEMS
このコレクションがhasMany
リレーションで作られた場合、リレーション条件から関連アイテムをすべて検索して削除した後で、保存を行います。SAVE_WITHOUT_DELETE
保存の前に削除を行いません。SAVE_ALL_BY_INSERT
コレクション内のすべてのアイテムは、bulkInsert
を使った挿入で保存されます。
デフォルトの値はSAVE_AFTER_DELETE_ITEMS | DELETE_LOGICAL_ITEMS
です。
$tags->save(Collection::SAVE_WITHOUT_DELETE);
// または
$tags->$saveOprions = Collection::SAVE_WITHOUT_DELETE;
$tags->save();
SAVE_ALL_BY_INSERT
が指定された場合、すべてのアイテムはbulkInsert
を使ってデータベースに保存されます。これは高速な保存が可能です。
Note: bulkInsert
を使用した場合、auto-incrementの値はモデルに反映されません。 auto-incrementの値を読み取る場合はrefresh()
メソッドを使用してください。