LionHeart SD BLOG

株式会社ライオンハート システムデザインの技術ブログ

インストールしたPropelを実際に利用してみる(その2:新規作成・更新・削除編)

こんにちは、株式会社ライオンハートの鵜飼です。

その1に引き続き、Propelについてのメモその2です。

その2では、新規作成、更新、削除についての処理です。

また、データベース構造はその1のサンプル構造を踏襲しています。

新規作成

リレーションを気にせず、単純に挿入する場合は下記の様に新規オブジェクトを生成し、値を代入していく流れとなります。

<?php
// $name, $a_category_idを代入する処理

// Sampleモデルを新規生成
$sample = \Application\Model\Sample();

// 値を代入
$sample->setName($name);
$sample->setACategoryId($a_category_id);

// 保存
$sample->save();

リレーションしているsample_b_category_relにもレコードを挿入する場合は、リレーションテーブルのオブジェクトを挿入する処理を保存する前に追加します。

<?php
// $name, $a_category_id, $b_category_id を代入する処理
// $b_category_id は配列が代入されているとする

// Sampleモデルを新規生成
$sample = \Application\Model\Sample();

// 値を代入
$sample->setName($name);
$sample->setACategoryId($a_category_id);

// sample_b_category_rel のレコードも代入
foreach($b_category_id as $b_id) {
    // SampleBCategoryRelモデルを新規生成
    $rel = new \Application\Model\SampleBCategoryRel();

    // 値を代入
    // sample_id はSampleモデルから挿入されるので、代入しなくてもOK
    $rel->setBCategoryId($b_id);

    // Sampleモデルに挿入
    $sample->addSampleBCategoryRel($rel);
}

// 保存
$sample->save();

編集

リレーションを気にしない場合は、データを取得した後は新規追加と同様に値を代入して保存するだけで編集することができます。

<?php
// $name, $a_category_idを代入する処理

// $id に該当するSampleモデルを取得する
$sample = \Application\Model\SampleQuery::create()->findPK($id);

// 値を代入
$sample->setName($name);
$sample->setACategoryId($a_category_id);

// 保存
$sample->save();

リレーションをしているテーブルの更新も行う場合については、これはまた回りくどい方法になっているので自身がないのですが、下記のような方法で実装をすることが出来ました。

リレーションをしているテーブルの更新も行う場合についても、ほぼ挿入の流れと同様です。addSampleBCategoryRelだと常に追加になってしまうので、Collectionを用意しておきsetSampleBCategoryRelsで一度に比較します。

<?php
// $name, $a_category_id, $b_category_id を代入する処理
// $b_category_id は配列が代入されているとする

// $id に該当するSampleモデルを取得する
$sample = \Application\Model\SampleQuery::create()->findPK($id);

// 値を代入
$sample->setName($name);
$sample->setACategoryId($a_category_id);

// 現状のリレーションデータを取得しておく
$rels_map = $sample->getSampleBCategoryRels()->toKeyValue('bCategoryId', 'Id');

// 更新データを格納するCollectionを生成する
$rels = new \Propel\Runtime\Collection\ObjectCollection();

// sample_b_category_rel のレコードも代入
foreach($b_category_id as $b_id) {
    // SampleBCategoryRelモデルを新規生成
    $rel = new \Application\Model\SampleBCategoryRel();

    // 値を代入
    // sample_id はSampleモデルから挿入されるので、代入しなくてもOK
    $rel->setBCategoryId($b_id);

    // まずはCollectionに挿入する
    $rels->append($rel);
}

// リレーションデータの比較を行う
// この時に失くなったデータには削除フラグが立つ
$sample->setSampleBCategoryRels($rels);

// 保存
$sample->save();

setSampleBCategoryRelsで自動的に削除フラグが立つのは良いのですが、比較を行うためには正確な値を入れておく必要があるのでややこしい処理になってしまっています。もう少しシンプルにしておきたいのですが…。

書き方が間違っていたので修正しました。前回に比べてシンプルになっています。

削除

検索条件に対して削除メソッドを実行するだけです。この辺りはORMライブラリの強みですね。

<?php
// $name を代入する処理

// 検索
$sample = \Application\Model\SampleQuery::create()
            ->filterByName($name);

// 削除
$sample->delete();

雑感

編集の所だけちょっと複雑な処理になっちゃってますが、それ以外はORMライブラリならではのシンプルな記述で実装できそうですね。
取り敢えず簡単な処理であればこの辺りの記法で何とかなりそうな気がしました。

もう少し試してみて気になる点があれば、また引き続きメモを残しておこうかと思います。