野鳥日記

野鳥と技術のブログ http://www.kiriya-system.com/

fuelphpのas_arrayでのkey指定の制限

fuelphpのas_arrayでのkey指定の制限

 

as_arrayで配列のキーを指定する場合、

キーのカラムがユニークである必要がある

プライマリーキーが複数カラムの場合も対応してない。

 

またまたハマったのでメモ

 

http://fuelphp.jp/docs/1.7/classes/database/usage.html#results

 

オプションとして、as_arrayから返る配列のキーと値を指定することもできます。

$result = DB::select()->from('users')->execute();
$on_key = $result->as_array('id');
foreach($on_key as $id => $item)
{
    // $id にはレコード ID が入る
    // $item またはその $id に関する処理
}

$key_value = $result->as_array('id', 'email');
foreach($key_value as $id => $email)
{
    // ここで $email には電子メールのフィールドが入るので
    // $id や $email に関する処理ができる
}

as_arrayのソースを見てみる。
/fuel/core/classes/database/result.php

 

        elseif ($value === null)
        {
            // Associative rows

            if ($this->_as_object)
            {
                foreach ($this as $row)
                {
                    $results[$row->$key] = $row;
                }
            }
            else
            {
                foreach ($this as $row)
                {
                    $results[$row[$key]] = $row;
                }
            }
        }

 上下は省略してます。

$resultsが結果なんですが

$results[$row[$key]] = $row;

とキー指定されたレコードの値で変数にいれてます。

 

つまりキー指定されたレコードの内容が同じになる場合は上書きされます。

プライマリーキーor ユニークなカラムで使いましょう。ということなんでしょうね。

ドキュメントに書いといてよ・・・

 

プライマリーキーが複数カラムの場合もこれだと上書きされるので使えません。

 

制限に引っかかる場合はキーの指定をせず

自分で配列に詰めなおしましょう!