我正在尝试将用户表中作者的用户名插入posts表中,但我没有这么做。我在为CRUD使用背包,但不确定自己在做什么错。我也不确定为什么会显示用户名而不是用户名本身的ID,因为正确的用户名会出现在选择框中。我收到以下错误:
SQLSTATE [23000]:违反完整性约束:1452无法添加或 更新子行:外键约束失败(
idf
。posts
, 约束posts_author_foreign
外键(author
)参考users
(username
))(SQL:插入posts
(title
,content
,author
,updated_at
,created_at
)值(aasdasd,asdasda
, 1,2018-12-24 04:25:23,2018-12-24 04:25:23))
我正在运行SQL 8,Laravel 5.7和PHP 7.1.19。到目前为止,我已经尝试通过artisan命令清除缓存并执行migration:refresh(这很好,因为我没有合法数据)。
在App \ Models \ Post中:
protected $table = 'posts';
protected $primaryKey = 'id';
protected $foreignKey = 'author';
public $timestamps = true;
protected $guarded = ['id'];
protected $fillable = [
'title', 'content', 'author'
];
protected $hidden = [];
protected $dates = [];
public function user()
{
return $this->hasOne('App\Models\User');
}
帖子表创建:
Schema::create('posts', function (Blueprint $table) {
$table->increments('id')->unique();
$table->string('title')->required();
$table->longtext('content')->required();
$table->string('author');
$table->foreign('author')->references('username')->on('users');
$table->timestamps();
});
在PostCrudController上选择框:
$this->crud->addField([
'label' => "Author",
'type' => 'select2',
'name' => 'author', // the db column for the foreign key
'entity' => 'user', // the method that defines the relationship in your Model
'attribute' => 'username', // foreign key attribute that is shown to user
'model' => "App\Models\User", // foreign key model
'options' => (function ($query) { //limit to only admins
return $query->orderBy('username', 'ASC')->where('admin', 1)->get();
}),
]);
总而言之,我只需要允许将select下拉列表中的用户名插入到author列中,这将是用户本身的用户名。
答案 0 :(得分:3)
我从您的问题中了解到的是,您正在尝试在posts表和用户之间添加关系。 因此,从我的角度来看,不要像
$table->foreign('author')->references('username')->on('users');
您应该像这样进行外键
$table->unsignedInteger('user_id')
$table->foreign('user_id')
->references('id')
->on('users')
->onUpdate('CASCADE')
->onDelete('CASCADE');
然后您可以在user_id列中传递用户的ID,以建立两者之间的关系。
使用这样的外键的好处是 id列是users表中的主键,因此它将唯一地标识您的用户 并且它是一个无符号整数,因此SQL引擎很容易为此索引。
现在要分配数据,您肯定可以在Post模型中建立以下雄辩的关系
public function user() {
return $this->belongsTo('App/User');
}
在添加帖子时,您可以使用
之类的急切加载(with()雄辩的方法)$posts = Post:::with('user)->get();
现在有了所有帖子,您可以访问任何关联的用户信息,例如:
forach ($posts as $post){
$userName = $post->user->name;
}
希望这会有所帮助。