2015-08-07 31 views
8

Tôi có hai mô hình có liên quan. Tôi đang cố thực hiện tìm kiếm trong Sản phẩm và chỉ hiển thị kết quả tìm kiếm thực tế thay vì TẤT CẢ các sản phẩm thuộc danh mục mà sản phẩm được tìm thấy. Tôi KHÔNG muốn tìm kiếm bất kỳ danh mục nào, vì các danh mục sẽ luôn được hiển thị bất kể nội dung nào được tìm kiếm và bất kể nội dung nào được tìm thấy.Mối quan hệ Tìm kiếm Laravel

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 

Vì vậy, những gì tôi muốn đạt được là như sau. Tôi thực hiện tìm kiếm sản phẩm có tên "Chuối". Những gì tôi muốn được hiển thị là:

Category Food 
- Product Banana 

Category Drinks 
- Product Banana Cocktail 

Category Candy 
- Product Banana Ice Cream 

Nhưng vấn đề của tôi là, với mã của tôi, nếu tôi thực hiện tìm kiếm cho "chuối", nó sẽ hiển thị các loại, trong đó chuối được tìm thấy, và nó sẽ trả về và hiển thị tất cả các sản phẩm trong danh mục đó thay vì CHỈ các sản phẩm mà tôi đã tìm kiếm. Làm thế nào tôi có thể đạt được nó để chỉ các sản phẩm được tìm kiếm mới được hiển thị?

Categories mẫu:

class Categories extends Eloquent { 

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

Sản phẩm mẫu:

class Products extends Eloquent { 

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

điều khiển của tôi:

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

Xem của tôi:

@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 
+0

Sản lượng mong muốn của bạn là gì? Như trong ví dụ "" thuộc về "Danh mục 1", "Danh mục 2" và "Danh mục 3", bạn muốn đầu ra xuất hiện như thế nào? – Ymartin

+0

Xin lỗi nhưng tôi không hoàn toàn hiểu bạn muốn nhận được gì từ truy vấn của mình, danh sách Danh mục hoặc danh sách Sản phẩm? –

+0

Tôi đã cập nhật câu hỏi của mình để giải thích rõ hơn :) Tôi muốn hiển thị danh sách các danh mục bao gồm các sản phẩm được liên kết với danh mục đó. – Hardist

Trả lời

12

Tôi không biết bạn đang xem kết quả như thế nào, nhưng tôi nghĩ nếu bạn chỉ mong muốn tải các sản phẩm lên các danh mục bạn nên tốt.

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

Đây là những gì tôi đang làm nhưng nó hiển thị tất cả các sản phẩm của một danh mục nếu một kết quả tìm kiếm được tìm thấy, thay vì chỉ hiển thị các sản phẩm đã được tìm kiếm. – Hardist

+1

Bạn đã thử mã của tôi chưa? –

+0

Không, bởi vì đó là chính xác những gì tôi đang sử dụng ngay bây giờ, sự khác biệt duy nhất là trong mã của bạn, bạn cũng thực hiện truy vấn tìm kiếm trên các danh mục không cần thiết. – Hardist

Các vấn đề liên quan