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

时间:2020-09-12 18:23:50

标签: database laravel eloquent relationship

我已经有一段时间没有与Laravel合作了,现在我正试图回过头来从事一个项目,但我感到困惑的是要通过一对多关系检索数据。

在用户模型中:

public function blackboard()
{
    return $this->hasMany(Blackboard::class);
}

在黑板模型中:

public function user()
{
    return $this->belongsTo(User::class);
}

在控制器中:

public function index()
{
    $blackboard = Blackboard::all();
        
    return view('home', ['blackboards' => $blackboard]);
}

在视图中:

<ul class="list-group">
    @foreach($blackboards as $blackboard)
       <li>{{ $blackboard->user->name }}</li>
    @endforeach
</ul>

在黑板上迁移:

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');
});

在用户迁移中

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();
});

以某种方式,它不允许我通过黑板数据显示用户信息,但出现以下错误:

Trying to get property 'name' of non-object (View: /var/www/html/intranet/resources/views/home.blade.php)

2 个答案:

答案 0 :(得分:0)

我认为您要做的就是提供外键名称,只有遵循laravel约定(如果您将其命名为user_id),您才可以忽略它:

在用户模型中:

public function blackboard(){
        return $this->hasMany(Blackboard::class,'created_by');
    }

在黑板模型中:

public function user(){
        return $this->belongsTo(User::class,'created_by');
    }

答案 1 :(得分:0)

Blackboard内部模型:

public function user()
{
    return $this->belongsTo(User::class, 'created_by', 'id');
}

如果您也想使反向关系正常工作,请在User模式下:

public function blackboard()
{
    return $this->hasMany(Blackboard::class, 'created_by', 'id');
}

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

public function index()
{
    $blackboard = Blackboard::with(['user'])->get();
        
    return view('home', ['blackboards' => $blackboard]);
}