与WHERE子句的Laravel关系不返回任何内容

时间:2017-10-05 04:40:39

标签: laravel relational-database

  

我有areas。每个area都有N curses
  因此,每个curse只属于one area

我的班级

class Area extends Model
{
    public function curses()
    {
        return $this->hasMany('App\Curse');
    }
}  

我的控制器

public function getCursesByAreaId()
    {
        $areaId = Input::get('areaId'); //ID of selected Area
        //area_id is a field of table CURSE. A FK to Area.
        $areas  = Area::with('curses')->where('area_id', $areaId)->get();  
        foreach($areas as $area)
        {
            var_dump($areas);
        }       

    }    

诅咒模型

class Curseextends Model
{
    protected $fillable =
    [
        'description',
        'area_id'
    ];
}

使用laravel的debugbar,我看到正在执行的查询是:

select * from "areas" where "area_id" = '2'  

是不是要运行关系查询? (加入)

已经检查我是否收到了id的权利,而且没问题 问题是它根本没有带来任何数据。

3 个答案:

答案 0 :(得分:1)

您需要以下内容:

$areas = Area::whereHas('curses', function($query) use ($areaId) {
    $query->where('area_id', $areaId);
})
->with('curses')
->get();

仅当您想获得具有匹配诅咒的区域时才需要whereHas

但是,我认为你可以这样做,如果你只需要相关的诅咒,因为一个诅咒只属于一个区域,所以,如果有区域,那么你将获得所有附加的诅咒:

$area = Area::with('curses')->find($areaId); // Single area

// Access the curses
$curses = $area->curses; // collection of curses

答案 1 :(得分:1)

我认为您正在使用area_id表格中的关系curse,请尝试按id而不是area_id检索区域ID,如下所示:< / p>

$areas  = Area::where('id', $areaId)->with('curses')->get(); 

希望你能得到解决方案。

答案 2 :(得分:1)

试试这个:

$areas = Area::whereHas('curses', function($area_query) use ($area_id) {
    $area_query->where('area_id', $area_id)
})
->with('curses')
->get();