Loading...
LaravelPHP

Laravel5で複合キーを扱う

はじめに

実験した環境は:
* Laravel 5.4 * php7.0 よく、「複合キーはサポートされていない、サロゲートキーを使用してくれ」という記事を見かけるので、複合キーを扱えるようにする方法を簡単に書く。

トレイトの作成

下記のトレイトを適当な場所に、CompositePrimaryKeyTrait.phpという名前で作成する。
<?php
namespace App;

use \Illuminate\Database\Eloquent\Builder;


trait CompositePrimaryKeyTrait
{
    /**
     * 複合キーに対応させるために使用する。
     * Set the keys for a save update query.
     *
     * @param  Builder  $query
     * @return Builder
     */
    protected function setKeysForSaveQuery(Builder $query)
    {
        if (is_array($this->primaryKey)) {
            foreach ($this->primaryKey as $pk) {
                $query->where($pk, '=', $this->original[$pk]);
            }
            return $query;
        }else{
            return parent::setKeysForSaveQuery($query);
        }
    }
}

モデルでの扱い

適当なモデルに、use CompositePrimaryKeyTrait;を追加するだけです。
namespace App;

use Illuminate\Database\Eloquent\Model;

class TestModel extends Model
{
    use CompositePrimaryKeyTrait;
    /**
     * 複合キー
     * @var array
     */
    protected $primaryKey = ['id', 'name'];
    ...
}

さいごに

これで
ErrorException in Model.php line XXXX: Illegal offset type in isset or empty
上記のような例外がでなくなるはずです。
One comment

コメントを残す

%d人のブロガーが「いいね」をつけました。