代码之家  ›  专栏  ›  技术社区  ›  Jani BoLd

无法理解拉雷维尔中雄辩的关系

  •  1
  • Jani BoLd  · 技术社区  · 7 年前

    我想从“我的用户”表中选择如下内容:

    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 
    

    时间:9:05

    因此返回以下错误:

    SQLSTATE[42S22]: Column not found: 1054 Unknown column 'users.room_id' in 'where clause' (SQL: select * from 用户 where 用户 . 房间id = 8 and 用户 房间id is not null )

    1 回复  |  直到 7 年前
        1
  •  0
  •   Brian Lee    7 年前

    房间和用户之间的关系是反向的。

    将用户模型更改为:

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

    以后可以通过查询范围或结果集合的筛选应用任何其他约束。

    推荐文章