2016-05-30 16 views
1
Schema::create('users', function (Blueprint $table) {<br> 
      $table->primary('email');<br> 
      $table->string('name');<br> 
      $table->string('image_url');<br> 
      $table->string('signin_with');<br> 
     }); 

上記は私のデータベーススキーマです。Laravel 5.2 - 'id'の代わりにプライマリキーをメールに設定

私のユーザーはです。

<?php 
namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Users extends Model 
{ 

    protected $table = 'users'; 
    public $incrementing = false; 
    protected $primaryKey = 'email'; 

    protected $fillable = [ 
     'email', 'name' ,'image_url', 'signin_with' 
    ]; 
} 

私の質問は、ユーザーのテーブルのプライマリキーとして 'email'属性を作りたいと思っています。しかし、私は

QueryException SQLState [42S01]のエラーを取得します。

どのように解決できますか?

ありがとうございます。

+0

に基づいて

。主キーはインクリメントのためにも使用されるので、 'unique'として設定し、' index'を追加することをお勧めします。 – Peon

+0

私は間違っている可能性がありますが、SQLState [42S01]はテーブルがすでに存在していることを私に示唆しています。あなたは完全なエラーメッセージを投稿できますか? – jeroen

+0

私は 'unique 'にそれを割り当てることができるので、私は電子メールIDがnullであることを望んでいません。それはそのテーブルの電子メールの1つのエントリになります。他のテーブルの電子メールIDは「外部キー」と「複合キー」として必要です。 エラーが [照らしなさい\データベース\のQueryException] SQLSTATE [42S01]です:ベーステーブルまたはビューがすでに存在している:1050 –

答えて

0

プライマリキーは他のテーブルへのリンクに使用され、文字列の比較はint比較よりも遅くなります。

複数のテーブルにユーザー情報を格納する場合、ユーザーテーブルの外部キーは電子メールアドレスになります。

これは、電子メールアドレスを複数回保存することを意味します。 したがって、電子メールを主キーとして使用する代わりに、自動インクリメントの主キーを使用します。お使いのユーザーのスキーマ内に

+0

電子メールIDは、他のテーブルで使用されている可能に基づいてされますので、はい..私がテーブルに電子メールを保存します私たちの要件の電子メールIDはプライマリキーでなければなりません。だから私はそれをどのように解決するのですか? –

0

:あなたはインデックスフィールド上の外部キーを持っていますユーザー

$table->integer('user_id')->unsigned(); 
$table->foreign('user_id')->references('id')->on('users'); 

を必要とする何かのモデルでは

$table->increments('id'); 
$table->string('email')->unique(); 

。このフィールドにUsersテーブルのプライマリキーを持つ必要はありません。あなたはおそらく「`主要key`として電子メールを設定したいドンhttps://laravel.com/docs/5.2/migrations#creating-indexes

関連する問題