Laravel查询不起作用

时间:2015-10-27 17:09:19

标签: sql laravel eloquent

我有这张桌子

ID

名称

大小

状态

酒店

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,它应该只返回那个房间的那个。 问题是它正在返回所有表条目。

有什么想法吗?

更新

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

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

谢谢你们!

2 个答案:

答案 0 :(得分:2)

你的尝试中有很多问题:

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

}

答案 1 :(得分:1)

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

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。您还可以在模型中发布关系代码吗?