我在XAMMP上将Laravel与MySQL一起使用。
我目前正在尝试在users
表和profiles
表之间建立简单的关系。创建新用户时,我想同时为该特定用户创建一个配置文件。从用户表引用我的uuid“ id”到配置文件表中的“ user_id”。所以我可以在我的应用程序中引用两者。
为此,我在“用户”模型中添加了启动功能。我正在尝试
现在,当我创建一个新用户时,出现以下错误:
SQLSTATE [HY000]:常规错误:1364字段“ id”没有默认值 值(SQL:插入
users
(name
,password
,updated_at
,created_at
)值(Jesper Deleuran Larsen, jesperdeleuranlarsen@gmail.com, $ 2y $ 10 $ mA4jZINdWhJXfbBihilI0.Lqmn3L5iTs9m7yI / tAuI5FWBVkIdYxu, 2019-06-02 19:56:11,2019-06-02 19:56:11))
如果我删除了User模型中的启动功能,它可以正常工作并生成一个新用户,但个人档案表当然是空的。所以我想错误是在模型中的某个地方,但我似乎无法弄清楚什么是错误的。
由于我是初学者,请告诉我整个设置是否以错误的方式进行。
非常感谢!
我的用户模型
<?php
namespace App;
use App\Mail\NewUserWelcomeMail;
use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Support\Facades\Mail;
class User extends Authenticatable
{
use Uuids; //UUID
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'id', 'name', 'email', 'password',
];
/**
* Indicates if the IDs are auto-incrementing.
*
* @var bool
*/
public $incrementing = false;
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
protected static function boot()
{
parent::boot();
static::created(function ($user) {
$user->profile()->create();
});
}
public function profile()
{
return $this->hasOne(Profile::class);
}
}
我的用户表迁移
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->uuid('id');
$table->primary('id');
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('users');
}
}
我的个人资料表迁移
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateProfilesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('profiles', function (Blueprint $table) {
$table->bigIncrements('id');
$table->uuid('user_id');
$table->string('company')->nullable();
$table->string('phone')->nullable();
$table->timestamps();
//Linking profiles table to users table
$table->index('user_id');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('profiles');
}
}
我的个人资料模型
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Profile extends Model
{
use Uuids; //UUID
//Disable fillable
protected $fillable = [
'id', 'user_id', 'company', 'phone',
];
public function user()
{
return $this->belongsTo(User::class);
}
}
我创建userids = uuids.php的特征
<?php
namespace App;
use Webpatser\Uuid\Uuid;
use Illuminate\Database\Eloquent\Model;
trait Uuids
{
/**
* Boot function from laravel.
*/
protected static function boot()
{
parent::boot();
static::creating(function ($model) {
$model->{$model->getKeyName()} = Uuid::generate()->string;
});
}
}
答案 0 :(得分:0)
只是一个猜测而没有看到您的Uuids
特性:
您(或软件包维护者)使用boot()
方法。它可以工作,但是在模型上定义自己的启动方法时会阻止您使用它。
为解决此类问题,Laravel实现了特征启动方法(see this)。
要使用它,只需将特征的boot()
方法重命名为bootUuids()
,它应该可以工作!
答案 1 :(得分:0)
更改了我的“ Uuids.php”
发件人:
/batch_classes/:batch_class_id/assignments/:id/edit(.:format).
收件人:
<?php
namespace App;
use Webpatser\Uuid\Uuid;
use Illuminate\Database\Eloquent\Model;
trait Uuids
{
/**
* Boot function from laravel.
*/
protected static function boot()
{
parent::boot();
static::creating(function ($model) {
$model->{$model->getKeyName()} = Uuid::generate()->string;
});
}
}
答案 2 :(得分:-1)
我认为这里要检查的第一件事是您的ID列是否在自动递增。快速浏览一下文档,->uuid()
和->primary()
都没有将列设置为自动奇怪地递增。
如果您实际上并不需要自动递增的字符串(因为您使用的是uuid,则完全可以),我们需要查看您在哪里创建用户,因为您需要传递ID创建时向用户显示。
让我知道检查后是否仍然需要帮助。