rhaco: データベース操作(update)

project.xmlでrequire="true"になっている場合はupdateの際にrequireの項目にダミーデータを入れてあげてください。ダミーを入れないとエラーが出ます。

その他unique="true"が設定されている場合はuniqueのカラムにダミーを入れたTableObjectを作成しQ::equalでuniqueのカラムを別途指定してあげないとエラーが出ます。例えばusersテーブルのidがunique="true"に設定されていてemailカラムを更新したい場合は下記の通りです。

$id = 10;
$users = $users_db->get(new Users(), new Criteria( Q::equal(Users::columnId(), $id) ));
$users->setId(0);
$users_db->update($users, new Criteria(Q::equal(Users::columnId(), $id), Q::which(Users::columnEmail())));

という感じになります(テストしていません)。

updateは何気に面倒くさいことが多いので注意してください。

project.xml

<project rhacover="1.6.1" version="0.0.1" name="rhaco_test" 
xmlns="http://rhaco.org" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://rhaco.org http://m.rhaco.org/xsd/project_1_6_x.xsd">
	<database name="rhaco">
		<table name="items" admin="true">
			<column name="id" type="serial" />
			<column name="name" type="string" require="true" />
			<column name="email" type="email" unique="true" require="true" />
			<column name="body" type="string" unique="true" require="true" />
			<column name="created" type="timestamp" default="sysdate" />
		</table>
	</database>
</project>

index.php

require('__init__.php');
Rhaco::import('database.DbUtil');
Rhaco::import('model.Items');

$db = new DbUtil(Items::connection());
$items = new Items();
$items->setEmail('yourname@hostname.com');
$items->setBody('This is body.');

// SQLUPDATE items SET email='yourname@hostname.com', body='This is body' WHERE name='Your Name' と同等
$criteria = new Criteria(
  Q::equal(Items::columnName(), 'Your Name')
  Q::which(Items::columnEmail()),
  Q::which(Items::columnBody())
);

$db->update($items, $criteria);