Я изменил модель, чтобы использовать UUID вместо возрастающего числа в качестве первичного ключа. Вот миграция:
Schema::create('games', function (Blueprint $table) {
$table->uuid('id')->primary()->default(DB::raw('(UUID())'));
$table->foreignUuid('user_id');
$table->string('title');
});
Я также модифицировал модель, изменив тип ключа на строку вместо стандартного целочисленного типа:
class Game extends Model
{
use HasFactory, HasApiTokens;
protected $keyType = 'string';
protected $fillable = [
"title",
"user_id",
];
}
но когда я вставляю новую запись с помощью метода create, идентификатор новой записи возвращает 0
$game = Game::create([
'title' => $request->input('title'),
'user_id' => $request->user()->id,
]);
dd($game);
Несмотря на то, что в результате для типа ключа задано значение «строка», поле id по-прежнему возвращает 0 (целое число).
Однако, если я проверю запись, созданную в базе данных, идентификатор действительно содержит строку UUID:
Может ли кто-нибудь указать мне, что я делаю неправильно здесь. Я новичок в Laravel. Может быть, я где-то допустил глупую ошибку. Также, пожалуйста, дайте мне знать, если мне нужно прикрепить сюда дополнительные справочные материалы. Спасибо.
Если вы используете предварительное определение БД, удалите лишнее (), чтобы просто: $table->uuid('id')->primary()->default(DB::raw('UUID()'));
В старые времена вам нужно было установить приращение в false, чтобы оно работало.
Ответил в комментариях к посту Арун А.С.
добавление use HasUuids
в Game
модель устраняет проблему:
//..
use Illuminate\Database\Eloquent\Concerns\HasUuids;
// other directives..
class Game extends Model
{
use HasFactory, HasApiTokens;
use HasUuids;
protected $keyType = 'string';
protected $fillable = [
"title",
"user_id",
];
}
Если вы используете laravel 9+, вы можете использовать официально поддерживаемый способ laravel.com/docs/9.x/eloquent#uuid-and-ulid-keys