首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel -尝试通过一对多关系获取数据

Laravel -尝试通过一对多关系获取数据
EN

Stack Overflow用户
提问于 2020-09-13 02:23:50
回答 2查看 32关注 0票数 0

我已经有很长一段时间没有和Laravel合作了,现在我正试图回来,正在做一个项目,但我对通过一对多关系检索数据感到困惑。

在用户模型中:

代码语言:javascript
复制
public function blackboard()
{
    return $this->hasMany(Blackboard::class);
}

在黑板模型中:

代码语言:javascript
复制
public function user()
{
    return $this->belongsTo(User::class);
}

在控制器中:

代码语言:javascript
复制
public function index()
{
    $blackboard = Blackboard::all();
        
    return view('home', ['blackboards' => $blackboard]);
}

在视图中:

代码语言:javascript
复制
<ul class="list-group">
    @foreach($blackboards as $blackboard)
       <li>{{ $blackboard->user->name }}</li>
    @endforeach
</ul>

在黑板迁移中:

代码语言:javascript
复制
Schema::create('blackboards', function (Blueprint $table)
{
    $table->bigIncrements('id');
    $table->text('title')->nullable(); //Need to take out
    $table->text('content')->nullable(); //Need to take out
    $table->unsignedBigInteger('created_by'); 
    $table->timestamps();

    $table->foreign('created_by')
        ->references('id')
        ->on('users')
        ->onDelete('cascade');
});

在用户迁移中

代码语言:javascript
复制
Schema::create('users', function (Blueprint $table)
{
    $table->bigIncrements('id');
    $table->string('name');
    $table->string('email')->unique();
    $table->timestamp('email_verified_at')->nullable();
    $table->string('password');
    $table->rememberToken();
    $table->timestamps();
});

不知何故,它不能让我通过黑板数据显示用户信息,我得到了如下错误:

代码语言:javascript
复制
Trying to get property 'name' of non-object (View: /var/www/html/intranet/resources/views/home.blade.php)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-13 02:36:42

在你的Blackboard模型中:

代码语言:javascript
复制
public function user()
{
    return $this->belongsTo(User::class, 'created_by', 'id');
}

如果你也想让反向关系起作用,在你的User模式中:

代码语言:javascript
复制
public function blackboard()
{
    return $this->hasMany(Blackboard::class, 'created_by', 'id');
}

别忘了在到达视图之前在Controller中加载用户,这将提高性能:

代码语言:javascript
复制
public function index()
{
    $blackboard = Blackboard::with(['user'])->get();
        
    return view('home', ['blackboards' => $blackboard]);
}
票数 0
EN

Stack Overflow用户

发布于 2020-09-13 02:35:31

我认为您所要做的就是提供外键名称,只有在遵循laravel约定的情况下才能省略它(如果您将其命名为user_id):

在用户模型中:

代码语言:javascript
复制
public function blackboard(){
        return $this->hasMany(Blackboard::class,'created_by');
    }

在黑板模型中:

代码语言:javascript
复制
public function user(){
        return $this->belongsTo(User::class,'created_by');
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63863579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档