Laravel关系搜索功能

时间:2015-12-02 15:44:06

标签: php laravel search relation

我知道以下错误来自何处,但我不知道如何修复它。

错误:

  

SQLSTATE [42S22]:找不到列:1054'where子句'中的未知列'expenses.date'(SQL:选择count(*)作为来自expenses_sections的聚合expenses。{{ 1}} LIKE%2015-12%)

导致它的原因(在我的控制器中):

date

我有一个用于更改页面布局的选择菜单。我有另一个选择菜单,我用它来显示某个月的结果。当我选择一个月时,上面的错误是我得到的,因为查询在错误的表中查找(因为上面的代码)。使用费用和部分之间的关​​系显示结果。我基本上想要的是在if($view === 'section') { $query = Section::query(); $query->with(['expenses' => function($query) use ($search){ $query->where('date', 'LIKE', '%2015-' . $search . '%')->get(); }]); } 表而不是expenses表中搜索结果而不破坏关系,因为基于关系,我的布局正在显示。

费用模型:

expenses_sections

部分模型:

class Expense extends Model
{
    public function section()
    {
        return $this->belongsTo('App\Http\Models\Expenses\Section');
    }
}

1 个答案:

答案 0 :(得分:1)

查询约束应始终返回查询构建器实例。你不应该在你的闭包中调用get,所以尝试修复它:

$query = Section::query();
$query->with(['expenses' => function($query) use ($search) {
    $query->where('date', 'LIKE', '%2015-' . $search . '%');
}]);

这将获取所有部分并急切加载关系。那些不适合约束的人只会有一个空的expenses关系。如果您只想要符合约束条件的部分,那么您应该使用whereHas方法。

$query = Section::query();
$query->with('expenses')->whereHas('expenses', function($query) use ($search) {
    $query->where('date', 'LIKE', '%2015-' . $search . '%');
});