我想从我的用户表中选择类似的内容:
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}})
答案 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);
}
以后可以通过查询范围或过滤生成的集合来应用任何其他约束。