<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<!-- EN-Revision: 24249 -->
<sect2 id="zend.validate.Db">
    <title>Db_RecordExists および Db_NoRecordExists</title>

    <para>
        <classname>Zend_Validate_Db_RecordExists</classname> および
        <classname>Zend_Validate_Db_NoRecordExists</classname> は、
        データベースのテーブル上に
        指定した値のレコードが存在するかどうかを調べる手段を提供します。
    </para>

    <sect3 id="zend.validate.set.db.options">
        <title>Zend_Validate_Db_* でサポートされるオプション</title>

        <para>
            <classname>Zend_Validate_Db_NoRecordExists</classname> および
            <classname>Zend_Validate_Db_RecordExists</classname> では下記のオプションがサポートされます。
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    <emphasis><property>adapter</property></emphasis>: 検索で使うデータベース･アダプタ
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis><property>exclude</property></emphasis>: 検索から除外するレコードを設定します
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis><property>field</property></emphasis>: レコードに対して検索される、このテーブル内のデータベース項目
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis><property>schema</property></emphasis>: 検索で使うスキーマを設定します
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis><property>table</property></emphasis>: レコードに対して検索されるテーブル
                </para>
            </listitem>
        </itemizedlist>
    </sect3>

    <sect3 id="zend.validate.db.basic-usage">
        <title>基本的な使用法</title>

        <para>
            このバリデータの基本的な使用例です。
        </para>

        <programlisting language="php"><![CDATA[
// メールアドレスがデータベース内に存在するかどうかを調べます
$validator = new Zend_Validate_Db_RecordExists(
    array(
        'table' => 'users',
        'field' => 'emailaddress'
    )
);
if ($validator->isValid($emailaddress)) {
    // メールアドレスは有効なようです
} else {
    // メールアドレスが無効なので、その理由を表示します
    foreach ($validator->getMessages() as $message) {
        echo "$message\n";
    }
}
]]></programlisting>

        <para>
            上の例は、指定したメールアドレスがデータベースのテーブル内に存在するかどうかを調べます。
            指定したカラムの値が <varname>$emailaddress</varname> に一致するレコードがなければ、
            エラーメッセージが表示されます。
        </para>

        <programlisting language="php"><![CDATA[
// ユーザ名がデータベースに存在しないことを調べます
$validator = new Zend_Validate_Db_NoRecordExists(
    array(
        'table' => 'users',
        'field' => 'username'
    )
);
if ($validator->isValid($username)) {
    // ユーザ名は有効なようです
} else {
    // ユーザ名が無効なので、その理由を表示します
    $messages = $validator->getMessages();
    foreach ($messages as $message) {
        echo "$message\n";
    }
}
]]></programlisting>

        <para>
            上の例は、指定したユーザ名がデータベースのテーブル上に存在しないことを確認します。
            指定したカラムの値が <varname>$username</varname> に一致するレコードが見つかれば、
            エラーメッセージが表示されます。
        </para>
    </sect3>

    <sect3 id="zend.validate.db.excluding-records">
        <title>レコードの除外</title>

        <para>
            <classname>Zend_Validate_Db_RecordExists</classname> および
            <classname>Zend_Validate_Db_NoRecordExists</classname> には、
            テーブルの一部を除外してその内容を調べる方法があります。
            where 句を文字列で指定するか、あるいはキー
            "field" および "value" を含む配列を指定します。
        </para>

        <para>
            除外条件を配列で指定すると、<emphasis>!=</emphasis> 演算子を使用します。
            つまり、テーブル内の残りのレコードの内容を確認してからレコードを変更できるのです
            (たとえばユーザ情報のフォームなどで使用します)。
        </para>

        <programlisting language="php"><![CDATA[
// そのユーザ名のユーザがほかにいないことを調べます
$user_id   = $user->getId();
$validator = new Zend_Validate_Db_NoRecordExists(
    array(
        'table' => 'users',
        'field' => 'username',
        'exclude' => array(
            'field' => 'id',
            'value' => $user_id
        )
    )
);

if ($validator->isValid($username)) {
    // ユーザ名は有効なようです
} else {
    // ユーザ名が無効なので、その理由を表示します
    $messages = $validator->getMessages();
    foreach ($messages as $message) {
        echo "$message\n";
    }
}
]]></programlisting>

        <para>
            上の例は、<command>id = $user_id</command>
            であるレコードを除いてそのテーブル内に $username
            を含むレコードが存在しないことを調べます。
        </para>

        <para>
            除外条件を文字列で指定することもできるので、
            <emphasis>!=</emphasis> 以外の演算子を指定することもできます。
            これは、複合キーに対するチェックの際に便利です。
        </para>

        <programlisting language="php"><![CDATA[
$email     = 'user@example.com';
$clause    = $db->quoteInto('email = ?', $email);
$validator = new Zend_Validate_Db_RecordExists(
    array(
        'table'   => 'users',
        'field'   => 'username',
        'exclude' => $clause
    )
);

if ($validator->isValid($username)) {
    // ユーザ名は有効なようです
} else {
    // ユーザ名が無効なので、その理由を表示します
    $messages = $validator->getMessages();
    foreach ($messages as $message) {
        echo "$message\n";
    }
}
]]></programlisting>

        <para>
            上の例では、ユーザ名 <varname>$username</varname> と email <varname>$email</varname>
            の両方を持つレコードだけが正しいことを確認するために、'users' テーブルを調べます。
        </para>
    </sect3>

    <sect3 id="zend.validate.db.database-adapters">
        <title>データベースアダプタ</title>

        <para>
            アダプタを指定することもできます。
            複数のデータベースアダプタを使用している場合や
            デフォルトのアダプタを設定していない場合などにこれを使用します。
            以下に例を示します。
        </para>

        <programlisting language="php"><![CDATA[
$validator = new Zend_Validate_Db_RecordExists(
    array(
        'table' => 'users',
        'field' => 'id',
        'adapter' => $dbAdapter
    )
);
]]></programlisting>
    </sect3>

    <sect3 id="zend.validate.db.database-schemas">
        <title>データベーススキーマ</title>

        <para>
            データベース内のスキーマを
            PostgreSQL や DB/2 のアダプタで指定するには、キー
            <property>table</property> および <property>schema</property> を持つ配列を次の例のように渡します。
            below:
        </para>

        <programlisting language="php"><![CDATA[
$validator = new Zend_Validate_Db_RecordExists(
    array(
        'table'  => 'users',
        'schema' => 'my',
        'field'  => 'id'
    )
);
]]></programlisting>
    </sect3>
</sect2>
