无法将用户名添加到 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;
}

希望这会有所帮助。