Laravel Eloquent после сохранения id становится 0

Это таблица перенесена с https://github.com/lucadegasperi/oauth2-server-laravel

В таблице oauth_clients тип данных поля id - varchar (40), а не int.

$name = Input::get('name');
$id = str_random(40);
$secret = str_random(40);

$client = new oauthClient;
$client->name = $name;
$client->id = $id;
$client->secret = $secret;
$client->save();

После сохранения(); $client-> id становится "0", а не строкой, которую я назначил.

Это приводит к тому, что следующая таблица соответствия сохраняется.

$endpoint = new OauthClientEndpoint(array('redirect_uri' => Input::get('redirect_uri));
$client->OauthClientEndpoint()->save($endpoint);

Я проверил $client->id: после сохранения он становится 0, и я получаю сообщение об ошибке, в том числе следующее:

(SQL: insert into 'oauth_client_endpoints' ('redirect_uri', 'client_id', 'updated_at', 'created_at') values (http://www.xxxxx.com, 0, 2014-09-01 11:10:16, 2014-09-01 11:10:16))

Я вручную сохранил конечную точку, чтобы предотвратить эту ошибку. Но как мне решить эту проблему?

Здесь моя модель:

class OauthClient extends Eloquent {

  protected $table = 'oauth_clients';

  public function OauthClientEndpoint(){
    return $this->hasOne('OauthClientEndpoint', 'client_id', 'id');
  }

}

class OauthClientEndpoint extends Eloquent {

  protected $table = 'oauth_client_endpoints';
  protected $fillable = array('redirect_uri');

  public function OauthClient(){
    return $this->belongsTo('OauthClient', 'client_id', 'id');
  }

}

class CreateOauthClientsTable extends Migration {
  public function up() {
    Schema::create('oauth_clients', function (Blueprint $table) {
      $table->string('id', 40);
      $table->string('secret', 40);
      $table->string('name');
      $table->timestamps();

      $table->unique('id');
      $table->unique(array('id', 'secret'));
    });
  }

  public function down() {
    Schema::drop('oauth_clients');
  }
}

class CreateOauthClientEndpointsTable extends Migration {
  public function up() {
    Schema::create('oauth_client_endpoints', function (Blueprint $table) {
      $table->increments('id');
      $table->string('client_id', 40);
      $table->string('redirect_uri');

      $table->timestamps();

      $table->foreign('client_id')
        ->references('id')->on('oauth_clients')
        ->onDelete('cascade')
        ->onUpdate('cascade');

    });
  }

  public function down() {
    Schema::table('oauth_client_endpoints', function ($table) {
      $table->dropForeign('oauth_client_endpoints_client_id_foreign');
    });

    Schema::drop('oauth_client_endpoints');
  }
}

Ответ 1

Когда вы устанавливаете свой собственный идентификатор и не используете auto_increment, обязательно добавьте public $incrementing = false; к этой модели. В вашем случае вы хотите:

class OauthClient extends Eloquent {

  public $incrementing = false;
  protected $table = 'oauth_clients';

  public function OauthClientEndpoint(){
    return $this->hasOne('OauthClientEndpoint', 'client_id', 'id');
  }

}

Это крошечный красный блок в огромной документации Laravel:

Примечание. Как правило, ваши модели Eloquent будут иметь автоматически увеличивающиеся клавиши. Однако, если вы хотите указать свои собственные ключи, установите для параметра incrementing property на вашей модели значение false.