2015-08-07 14 views
8

Ho due modelli correlati. Sto cercando di effettuare una ricerca in Prodotti e di visualizzare solo i risultati di ricerca effettivi anziché TUTTI i prodotti della categoria in cui è stato trovato il prodotto. NON desidero cercare alcuna categoria, poiché le categorie verranno SEMPRE visualizzate indipendentemente da ciò che è stato cercato e indipendentemente da ciò che è stato trovato.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 

Quindi, quello che voglio ottenere è il seguente. Faccio una ricerca per un prodotto chiamato "Banana". Quello che voglio essere visualizzato è:

Category Food 
- Product Banana 

Category Drinks 
- Product Banana Cocktail 

Category Candy 
- Product Banana Ice Cream 

Ma il mio problema è, con il mio codice, se effettuo una ricerca per "Banana", visualizza la categoria in cui si trova la banana, e restituisce e visualizza tutti prodotti in quella categoria invece di SOLO i prodotti che ho cercato. Come posso ottenerlo in modo che vengano visualizzati solo i prodotti cercati?

Categorie Modello:

class Categories extends Eloquent { 

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

Prodotti Modello:

class Products extends Eloquent { 

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

mio controller:

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

mio punto di vista:

@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

Qual è l'output desiderato? Come in se "Esempio" appartiene a "Categoria 1", "Categoria 2" e "Categoria 3", come vuoi che venga visualizzato l'output? – Ymartin

+0

Scusa ma non ho capito bene cosa vuoi ottenere dalla tua query, un elenco di categorie o un elenco di prodotti? –

+0

Ho aggiornato la mia domanda per spiegarlo meglio :) Voglio visualizzare un elenco di categorie compresi i prodotti che sono collegati a quella categoria. – Hardist

risposta

12

Non so come si visualizzano i risultati, ma penso che se solo carichi i prodotti nelle categorie dovresti essere bravo.

$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

Questo è quello che sto facendo ma visualizza tutti i prodotti di una categoria se è stato trovato un risultato di ricerca, invece di visualizzare solo i prodotti che sono stati cercati. – Hardist

+1

Hai provato il mio codice? –

+0

No, perché è esattamente quello che sto usando in questo momento, l'unica differenza è che nel tuo codice, esegui anche la query di ricerca sulle categorie che non sono necessarie. – Hardist