无法将用户名添加到 Post 作者
Unable to Add Username to Post Author
我正在尝试将用户 table 的作者用户名插入到帖子 table 中,但它不允许我这么做。我正在为我的 CRUD 使用 Backpack,但我不确定我做错了什么。我也不确定为什么 ID 显示的是用户名而不是用户名本身,因为正确的用户名出现在 select 框中。我收到以下错误:
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or
update a child row: a foreign key constraint fails (idf
.posts
,
CONSTRAINT posts_author_foreign
FOREIGN KEY (author
) REFERENCES
users
(username
)) (SQL: insert into posts
(title
, content
,
author
, updated_at
, created_at
) values (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 命令清除缓存并执行 migrate:refresh(这很好,因为我没有合法数据)。
In 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');
}
帖子 Table 创建:
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();
});
Select 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 下拉列表中的用户名插入作者列,这将是用户本身的用户名。
我从你的问题中了解到,你正试图在你的帖子 table 和用户之间添加一种关系。
所以从我的角度来看,而不是像
那样使用外国移民
$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 table 中的主键,因此它将唯一标识您的用户
它是一个无符号整数,因此 SQL 引擎很容易对其进行索引。
现在,为了获取数据,您绝对可以在 Post 模型中使用以下 eloquent 关系
public function user() {
return $this->belongsTo('App/User');
}
在添加帖子时,您可以使用预先加载(with() eloquent 方法),例如
$posts = Post:::with('user)->get();
现在您可以通过所有帖子访问任何关联的用户信息,例如:
forach ($posts as $post){
$userName = $post->user->name;
}
希望这会有所帮助。
我正在尝试将用户 table 的作者用户名插入到帖子 table 中,但它不允许我这么做。我正在为我的 CRUD 使用 Backpack,但我不确定我做错了什么。我也不确定为什么 ID 显示的是用户名而不是用户名本身,因为正确的用户名出现在 select 框中。我收到以下错误:
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (
idf
.posts
, CONSTRAINTposts_author_foreign
FOREIGN KEY (author
) REFERENCESusers
(username
)) (SQL: insert intoposts
(title
,content
,author
,updated_at
,created_at
) values (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 命令清除缓存并执行 migrate:refresh(这很好,因为我没有合法数据)。
In 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');
}
帖子 Table 创建:
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();
});
Select 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 下拉列表中的用户名插入作者列,这将是用户本身的用户名。
我从你的问题中了解到,你正试图在你的帖子 table 和用户之间添加一种关系。 所以从我的角度来看,而不是像
那样使用外国移民$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 table 中的主键,因此它将唯一标识您的用户 它是一个无符号整数,因此 SQL 引擎很容易对其进行索引。
现在,为了获取数据,您绝对可以在 Post 模型中使用以下 eloquent 关系
public function user() {
return $this->belongsTo('App/User');
}
在添加帖子时,您可以使用预先加载(with() eloquent 方法),例如
$posts = Post:::with('user)->get();
现在您可以通过所有帖子访问任何关联的用户信息,例如:
forach ($posts as $post){
$userName = $post->user->name;
}
希望这会有所帮助。