不能理解在laravel中雄辩的关系

时间:2018-04-08 05:41:28

标签: laravel eloquent relation

我想从我的用户表中选择类似的内容:

select name from users where room.user1_id = user.id

我的想法是在一个房间里有两个用户。在我的用户模型中,我有这些:

public function room(){
    return $this->belongsTo('App\Room', 'user1_id');
}

在房间模型中:

public function user(){
    return $this->hasMany('App\User');
}

我试图在控制器中这样调用:

$room = Room::find($room_id);
return $room->user->name;

以下是一个例子:

https://www.youtube.com/watch?v=42l4nHl_aUM 

at:9:05

所以这会返回此错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'users.room_id' in 'where clause' (SQL: select * from {用户{1}} {用户{1}} {ROOM_ID {1}} {用户{1}} {ROOM_ID {1}})

1 个答案:

答案 0 :(得分:0)

房间和用户之间的关系是倒退的。

将您的用户模型更改为:

public function room(){
    return $this->hasOne(App\Room::class, 'user1_id');
}

和房间模型:

public function user1 (){
    return $this->belongsTo(App\User::class, 'user1_id');
}

public function user2 (){
    return $this->belongsTo(App\User::class, 'user2_id');
}

但是,如果将来可以为用户分配差异事件,预订等房间,那么创建数据透视表并使用多对多关系会更好。公约将其命名为room_user,并在迁移中定义为:

$table->unsignedInteger('room_id');
$table->unsignedInteger('user_id');

$table->foreign('room_id')->references('id')->on('rooms');
$table->foreign('user_id')->references('id')->on('users');

然后您的模型关系将变为:

// User.php
public function rooms (){
    return $this->belongsToMany(App\Room::class);
}

// Room.php
public function users (){
    return $this->belongsToMany(App\User::class);
}

以后可以通过查询范围或过滤生成的集合来应用任何其他约束。