【问题标题】:Laravel relation search functionLaravel 关系搜索功能
【发布时间】:2015-12-02 15:44:05
【问题描述】:

我知道以下错误来自哪里,但我不知道如何解决它。

错误:

SQLSTATE[42S22]:未找到列:1054 'where 子句'中的未知列'expenses.date'(SQL:从expenses_sections 中选择计数(*)作为聚合,其中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();
        }]);
}

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

费用模型:

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

【问题讨论】:

  • expensedate 字段吗?
  • 如果你有有 costs_id 和 section_id 的 costs_sections,你应该使用 hasManyThrough(),但我总是很难让这些第一次工作,所以而不是我试图回答它,阅读这个等待更好的回复:laravel.com/docs/5.1/eloquent-relationships#has-many-through
  • 太棒了,当然最好自己阅读而不是得到我可以立即使用的答案,所以我谢谢你! :)
  • @RonBrouwers - 实际上我可能错了。看看上面关于数据透视表的部分。我想我现在应该去睡觉了……
  • 我知道数据透视表,但我还没有检查过 hasManyThrough,所以无论哪种方式我都会学到一些东西,这是我的最终目标:)

标签: php laravel search relation


【解决方案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 . '%');
});

【讨论】:

  • 感谢您的回答。我发现错误在其他地方,所以在尝试使用您的答案后我自己修复了它。尽管如此,仍将其标记为已接受。
猜你喜欢
  • 1970-01-01
  • 2015-10-30
  • 2015-06-11
  • 1970-01-01
  • 2021-12-17
  • 2016-09-15
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多