Laravel搜索关联关系

19

我有两个相关的模型。我正在尝试在产品中进行搜索,并仅显示实际的搜索结果,而不是在找到产品所属类别中的所有产品。我不想搜索任何类别,因为无论搜索什么和找到什么,类别都将始终显示。

Example. I have the following categories:

- Food
- Drinks
- Candy

My "Food" category has the following products:

- Strawberry
- Apple
- Banana

My "Drinks" category has the following products:

- Banana Cocktail
- Beer
- Cola

My "Candy" category has the following products:

- Strawberry Lollipop
- Chocolate Bar
- Banana Ice Cream

所以,我想要实现以下目标。我在搜索名为“香蕉”的产品。我想要显示的内容是:

Category Food
- Product Banana

Category Drinks
- Product Banana Cocktail

Category Candy
- Product Banana Ice Cream

但我的问题是,使用我的代码,如果我搜索“香蕉”,它会显示香蕉所在的类别,并返回并显示该类别中的所有产品,而不仅仅是我搜索的产品。如何做到只显示搜索到的产品?

分类模型:

class Categories extends Eloquent {

    public function products()
    {
        return $this->hasMany('Products');
    } 
}

产品型号:

class Products extends Eloquent {

    public function categories()
    {
        return $this->belongsTo('Categories');
    }
}

我的控制器:

    $searchString       = Input::get('search');

    if($searchString)
    {
        $categories = Categories::with('products')->orderBy($order, $by)->whereHas('products', function ($query) use ($searchString){
            $query->where('name', 'like', '%'.$searchString.'%');
        })->get();
    }
    else {
        $categories     = Categories::with('products')->orderBy($order, $by)->get();
    }

我的观点:

@foreach($categories as $category)
    {{ $category->name }} // Show the category name

    @foreach($category->products as $product)
    {{ $product->name }} // Show all products in that category

    @endforeach
@endforeach

你想要什么样的输出?比如说,如果“Example”属于“Category 1”,“Category 2”和“Category 3”,你希望输出以何种形式呈现? - Ymartin
抱歉,我不太明白您想从查询中获取什么,是类别列表还是产品列表? - Juan Girini
我更新了我的问题以更好地解释它 :) 我想显示一个包括与该类别相关联的产品的类别列表。 - Hardist
1个回答

60

我不知道你是怎样查看结果的,但我认为如果你只是在类别上急切加载产品,那么应该可以解决问题。

$categories = Categories::whereHas('products', function ($query) use ($searchString){
        $query->where('name', 'like', '%'.$searchString.'%');
    })
    ->with(['products' => function($query) use ($searchString){
        $query->where('name', 'like', '%'.$searchString.'%');
    }])->get();

foreach($categories as $category){
    echo $category->name . ':' . PHP_EOL;
    foreach($category->products as $product){
        echo . '-' . $product->name . PHP_EOL;
    }
}

这是我正在做的事情,但如果找到一个搜索结果,它会显示该类别的所有产品,而不仅仅是搜索到的产品。 - Hardist
不需要,因为那正是我现在使用的,唯一的区别在于你的代码还对类别进行了搜索查询,但这并不需要。 - Hardist
1
你的代码的作用是获取所有包含搜索字符串的产品类别,但它并没有过滤产品。只需复制粘贴我的解决方案并检查输出即可。 - Pawel Bieszczad
我尝试了你的代码,但是它给了我这个错误:语法错误,意外的 '=>' (T_DOUBLE_ARROW)所以我把 '=>' 改成了逗号 (->with('products', function ($query)),但是它又给了我这个错误:explode() 函数期望第二个参数是字符串,但是传递了一个对象 - Hardist
我认为这就是为什么我以为我已经尝试过了,因为我看不出与之前所做的任何区别。但实际上这确实有效,所以赏金值得拥有,谢谢 :)
  • 尽管 你可以在19小时内授予你的赏金 - 你将在明天获得它。
- Hardist
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接