【问题标题】:Laravel Search RelationshipLaravel 搜索关系
【发布时间】:2015-10-30 13:23:34
【问题描述】:

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

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”,您希望输出如何显示?
  • 抱歉,我不太明白您想从查询中得到什么,是类别列表还是产品列表?
  • 我更新了我的问题以更好地解释它:) 我想显示一个类别列表,包括链接到该类别的产品。

标签: php laravel search relation


【解决方案1】:

我不知道您是如何查看结果的,但我认为如果您只是急切地将产品加载到类别中,您应该会很好。

$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;
    }
}

【讨论】:

  • 这是我正在做的,但如果找到一个搜索结果,它会显示一个类别的所有产品,而不是只显示搜索到的产品。
  • 不,因为它正是我现在使用的,唯一的区别是在你的代码中,你还对不需要的类别执行搜索查询。
  • 您的代码所做的是获取所有包含搜索字符串产品的类别。它不过滤产品。只需复制粘贴我的解决方案并检查输出。
  • 我试过你的代码,它给了我这个错误:语法错误,意外'=>'(T_DOUBLE_ARROW)所以我将'=>'更改为逗号(->with('products', function ($query)),它给了我这个错误:explode() 期望参数 2 是字符串,给定对象
  • 我认为这就是我认为我已经尝试过的原因,因为我看不出与以前所做的任何不同。但这确实有效,所以赏金来之不易,谢谢 :) - 虽然 你可能会在 19 小时内奖励你的赏金 - 你明天就会得到它。
猜你喜欢
  • 2015-06-11
  • 1970-01-01
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-30
  • 2015-10-29
相关资源
最近更新 更多