Laravel

Laravel 4 составной первичный ключ (PK)

Бывают иногда задачи, когда требуется использовать составной первичный ключ (Primary Key).

К примеру, возьмём табличку:
product_id int(11)
materials_id    int(11)
price       decimal(15,2)
show        tinyint(1)
Хоть и в руководстве PL/SQL Developer's Guide рекомендуется не использовать составные первичные ключи, но в данном случае думаю нет необходимости создавать сурогатный ключ, так как привязки к этой таблице с внешних таблиц нет.

Можно добавить еще одно поле в таблицу в качестве "первичного ключа", но это не снимает необходимости добавления ограничения уникальности по данным двум полям product_id,materials_id, но, и не нужно забывать про ограничение уникальности (UNIQUE CONSTRAINT). Если дублирование product_id,materials_id,price,show - ошибка, ограничение уникальности НЕОБХОДИМО. Если на первичный ключ придется ссылаться во внешних ключах многих таблиц, имеет смысл использовать суррогатный ключ. Если внешних ключей немного, можно использовал составной первичный ключ.

На эту тему можно рассуждать долго, есть свои плюсы и минусы в любом варианте, но суть заметки как в Laravel 4 использовать составной ключ.
Во многих источниках находил информацию, что Laravel не работает с сотавными ключами и решил поиграться, в итоге всё работает.
К примеру, создаём в таблице product_material базы данных MySQL ключь PRIMARY с двумя полями product_id,materials_id , или с помощью Schema Builder:
Schema::create('product_material', function(Blueprint $table)
{
    $table->integer('product_id');
    $table->integer('materials_id');
    $table->decimal('price', 15, 2)->index()->default(0);
    $table->tinyInteger('show')->index()->default(1);
    //$table->unique(array('product_id','materials_id'));

    $table->primary(array('product_id', 'materials_id'));
});

В моделе, указываем первичный составной ключь, к примеру:
class ProductMaterial extends Eloquent
{
    /**
     * The database table used by the model
     *
     * @var string
     */
    protected $table = 'product_material';

    /**
     * Indicates if the model has update and creation timestamps
     *
     * @var bool
     */
    public $timestamps = false;

    /**
     * Primary Key
     *
     * @var integer
     */
    protected $primaryKey = array('product_id','materials_id');

    /**
     * Indicates if the IDs are auto-incrementing
     *
     * @var bool
     */
    public $incrementing = false;
}
Обязательно убираем автоматическое приращение.
Valentin Rasulov

Комментариев нет

Чтобы оставить комментарий необходимо авторизоваться