【问题标题】:Laravel where query not working查询不起作用的Laravel
【发布时间】:2015-10-27 17:09:18
【问题描述】:

我有这张桌子

身份证

名字

尺寸

房间

状态

酒店

created_at

updated_at

我需要过滤属于某个房间的所有床位。为此,我编写了这些代码行。

public function index()
    {
        //
        $user = JWTAuth::parseToken()->authenticate();
        $data = Input::get('room');
        if( $data ){
            $beds = Bed::where('room', '=', $data )->get();
        }else{
            $beds = Bed::where('hotel', '=', $user->hostel )->get();    
        }

        foreach( $beds as $bed) {
            return $bed->get( array('size','room', 'id') );
        }
    }

所以,如果我给它房间 ID,它应该只返回那个房间的 ID。 问题是它正在返回所有表条目。

有什么想法吗?


更新

修复了关系并尝试了这个:

return Room::with('beds')->findOrFail($data)->beds;

现在它给了我项目的数量。 如何获得物品?


更新

这是模型的代码:

class Room extends \Eloquent {
    protected $fillable = array('beds', 'price', 'name', 'description','hotel');

    public function beds(){
        return $this->hasMany('Bed', 'id', 'room');
    }
}

更新

var_dump 用于:

var_dump( Room::with('beds')->findOrFail($data)->beds );

是:

int(1)

更新

所以,最终的代码如下。

控制器

public function index()
    {
        //
        $user = JWTAuth::parseToken()->authenticate();
        $data = Input::get('room');
        if( $data ){
            $d = intval( $data );
            return Bed::where('room', '=', $d )->get( array('size', 'room', 'id', 'name') );
        }else{
            return Bed::where('hotel', '=', $user->hostel )->get( array('size', 'room', 'id', 'name') );    
        }

    }

型号

class Room extends \Eloquent {
    protected $fillable = array('beds', 'price', 'name', 'description','hotel');

    public function camas(){
        return $this->hasMany('Bed', 'room', 'id');
    }
}

谢谢你们!

【问题讨论】:

  • 我猜你的 $data 变量设置不正确,你的 else 案例正在触发,发回所有内容。你试过转储$data吗?
  • 试过了。它触发了if。它不会进入 else 案例。我认为这可能是因为 $data 是字符串。但改为运行 intval( $data ),结果相同
  • 奇怪的是,当我给出一个没有床相关的房间 ID 时,它返回空。但是对于任何分配了床位的人,返回所有表格条目
  • 看看我的帖子的编辑是否有帮助

标签: sql laravel eloquent


【解决方案1】:

您的尝试中有很多问题:

return $bed->get( array('size', 'room', 'id') );
// runs SELECT size, room, id from `rooms`

所以它返回所有房间(到底为什么你想在 foreach 中这样做?)


return $this->hasMany('Bed', 'id', 'room');
// should be:
return $this->hasMany('Bed', 'room', 'id');

protected $fillable = array('beds', ...
public function beds(){

这是冲突 - 调用 $room->beds 时您永远不会得到关系,因为您的桌子上有一个列 beds


也就是说,这就是你需要的:

public function index()
{
    $user = JWTAuth::parseToken()->authenticate();

    if(Input::has('room')){
        $query = Bed::where('room', '=', Input::get('room'));
    }else{
        $query = Bed::where('hotel', '=', $user->hostel);    
    }

    return $query->get(['size', 'room', 'id']); // given you need only these columns

}

【讨论】:

    【解决方案2】:

    试试这个,看看它是否有效。如果没有,能否提供Input::get('room')var_dump 和beds 表的结构?

    public function index()
    {
        //
        $user = JWTAuth::parseToken()->authenticate();
        $data = Input::get('room');
        if( $data ){
            $beds = Bed::where('room', '=', $data );
        }else{
            $beds = Bed::where('hotel', '=', $user->hostel );    
        }
    
    
        return $beds->get(['size','room', 'id'])->toArray();
    }
    

    如果您想在房间里获得特定床位并且您的关系设置正确,那就更好了:

    return Room::with('beds')->findOrFail($data)->beds;
    

    编辑

    我看到了你的更新。你确定它给了你一些项目,也许有一个项目,数字是它的 id。你能验证吗?如果不是这样,请提供它的 vardump。您还可以发布模型中关系的代码吗?

    【讨论】:

    • 在 phpmyadmin 中做了一些测试。问题是变量是一个字符串。我正在尝试找到一种将其转换为整数的方法。有什么想法吗?
    • 请提供表结构和我提到的vardump。
    • string(1) "2" 是 vardump
    • 表中room的数据类型是什么? varchar?诠释?
    猜你喜欢
    • 2015-01-13
    • 1970-01-01
    • 2017-05-09
    • 2017-11-08
    • 2018-11-10
    • 1970-01-01
    • 2018-09-09
    • 2017-11-26
    • 2017-04-23
    相关资源
    最近更新 更多