我正在尝试从用户表中获取(然后显示(带有文章表中外键的创建者/作者姓名。我只是 laravel 的新手,希望你能帮助我解决这个问题。我对 int 类型 F 键没有问题,但对于字符串类型,我可能在某处缺少一些东西。有时它会给我一些错误,有时一切正常,但文章表上的user_name只是保持空。如果您需要有关某事的更多信息,请发表评论。提前感谢!
文章的架构
Schema::create('articles', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->string('user_name')->nullable();
$table->string('title');
$table->text('body');
$table->timestamps();
$table->timestamp('published_at');
$table->foreign('user_id')
->references('id')
->on('users')
->onDelete('cascade');
$table->foreign('user_name')
->references('name')
->on('users')
->onDelete('cascade');
});
用户的架构
Schema::create('users', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id');
$table->string('name')->unique();
$table->string('email')->unique();
$table->string('password', 60);
$table->rememberToken();
$table->timestamps();
});
不要在文章中保存用户名。您只需保存用户 ID 并在模型中创建关系,例如
class User extends Model {
public function articles() {
return $this->hasMany('AppArticle');
}
}
class Article extends Model {
public function user() {
return $this->belongsTo('AppUser');
}
}
如果您的关系设置正确,您可以像这样访问用户名:
$article->user->name
在另一个方向上,你可以用以下方式让用户的文章:
$user->articles
注意:关系的处理方式与属性不同,而不是函数。
我的建议是...
- 从文章中删除user_name。 让user_id引出用户数据。
- 使用Laravel的内置用户类来扩展模型
- 创建文章类以扩展模型
- 设置它们之间的关系
应用/用户.php
namespace App;
use IlluminateDatabaseEloquentModel;
use ...
class User extends ...{
public function Articles(){
return $this->hasMany(Articles::class)
}
}
应用/文章.php 使用Illuminate\Database\Eloquent\Model;
namespace App;
class Article extends Model{
public function User(){
return $this->belongsTo(User::class);
}
public function getAuthorAttribute(){
return $this->User->name;
}
}
现在,您可以以以下身份访问数据...
$user->Articles;
$article->User
$article->author
若要优化访问,可以通过将任何关系作为函数调用来获取查询生成器。
$user->Articles()->where('title, 'like', 'cars')->get()
看看发生了什么...
$user->Articles()->where('title, 'like', 'cars')->toSql()