2015-08-07 17 views
8

Mam dwa modele, które są powiązane. Próbuję wyszukać w Produktach i wyświetlać rzeczywiste wyniki wyszukiwania zamiast WSZYSTKICH produktów z kategorii, w której produkt został znaleziony. NIE chcę wyszukiwać żadnych kategorii, ponieważ kategorie będą ZAWSZE wyświetlane bez względu na to, co było wyszukiwane i bez względu na to, co zostało znalezione.Laravel Search Relationship

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 

A więc CHCĘ osiągnąć to co następuje. Szukam produktu o nazwie "Banan". Co chcę być wyświetlane jest:

Category Food 
- Product Banana 

Category Drinks 
- Product Banana Cocktail 

Category Candy 
- Product Banana Ice Cream 

Ale mój problem jest z mojego kodu, jeśli mogę przeprowadzić wyszukiwanie dla „banan”, wyświetla kategorię, w której znajduje się banan, i zwraca i wyświetla wszystkie produkty w tej kategorii zamiast TYLKO produktów, których szukałem. Jak mogę to osiągnąć, aby wyświetlały się tylko te produkty, które były wyszukiwane?

Kategorie Model:

class Categories extends Eloquent { 

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

Produkty Model:

class Products extends Eloquent { 

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

My Kontroler:

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

moim zdaniem:

@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

Jakie są pożądane wyniki? Jak w przypadku, gdy "Przykład" należy do "Kategorii 1", "Kategoria 2" i "Kategoria 3", w jaki sposób ma wyglądać wydruk? – Ymartin

+0

Przepraszam, ale nie bardzo rozumiem, co chcesz uzyskać z zapytania, listę kategorii lub listę produktów? –

+0

Zaktualizowałem moje pytanie, aby wyjaśnić to lepiej :) Chcę wyświetlić listę kategorii, w tym produkty, które są powiązane z tą kategorią. – Hardist

Odpowiedz

12

Nie wiem, jak przeglądasz wyniki, ale myślę, że jeśli chcesz tylko załadować produkty na kategorie, powinieneś być dobry.

$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

To jest to, co robię, ale wyświetla wszystkie produkty kategorii, jeśli znaleziono jeden wynik wyszukiwania, zamiast wyświetlać tylko te produkty, które były wyszukiwane. – Hardist

+1

Czy wypróbowałeś mój kod? –

+0

Nie, ponieważ jest to dokładnie to, czego teraz używam, jedyną różnicą jest to, że w kodzie wykonuje się również zapytanie o kategorie, które nie są potrzebne. – Hardist