Laravel - 使用Laravel when子句查询嵌套关系

时间:2016-04-24 05:53:37

标签: php mysql laravel laravel-5.2

// This comes in as an array - item_category[]
$category = \Request::input('item_category'); 

Item::with('category')
    ->when($category, function($q) use ($category) {
        $q->whereHas('category', function($q) use ($category) {
            $q->whereIn('category', $category);
        });
    })->get();

您好,我正在尝试检索类别等于通过的任何类别的所有项目。但是,类别是过滤器,用户可能会也可能不会检查此类,因此将when子句链接到模型。代码当前抛出错误

 Column not found: 1054 Unknown column 'has' in 'where clause' (SQL: select * from `items` where `has` = category)

如果我这样做

    Item::with('category')
    ->whereHas('category', function($q) use ($category) {
            $q->whereIn('category', $category);
        })->get();

这将起作用,除非用户没有检查任何item_category复选框,否则查询将返回0结果,因为它期望此值通过。 我真的不知道这里做了什么。任何建议。 的问候,

项目表

 id   category_id   title   description   price   timestamps

类别表

 id   category

Item.php

 public function category()
 {
    return $this->belongsTo('App\Category', 'category_id');
 }

1 个答案:

答案 0 :(得分:0)

Laravel似乎将您的嵌套whereHas(...)解释为where('has', ...)而不是您想要的。我不知道为什么,但我猜这是子条款的工作方式。

你可以做的是首先创建基本查询,然后自己进行检查并对其进行扩充,如下所示:

$category = \Request::input('item_category'); 
$query = Item::with('category');
if ($category)  {
    $query->whereHas('category', function($q) use ($category) {
        $q->whereIn('category', $category);
    });
}
$results = $query->get();

虽然不应该是category_id而不是category?