Laravel 关系搜索功能

Laravel relation search function

我知道以下错误的来源,但我不知道如何解决。

错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'expenses.date' in 'where clause' (SQL: select count(*) as aggregate from expenses_sections where expenses.date LIKE %2015-12%)

是什么原因造成的(在我的控制器中):

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

我有一个 select 菜单,我用它来更改页面的布局。我有另一个 select 菜单,我用它来显示特定月份的结果。上面的错误是我 select 一个月时得到的,因为查询查找错误 table (因为上面的代码)。使用费用和部分之间的关​​系显示结果。我基本上想要的是在 expenses table 中搜索结果,而不是在 expenses_sections table 中搜索结果,当然不会破坏关系,因为基于关系,我的布局正在显示。

费用模型:

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

剖面模型:

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

查询约束应始终 return 查询生成器实例。你不应该在你的闭包中调用 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 . '%');
});