2014-09-28 11 views
5

nel mio modello Image Ho due rapporti con il mio modello Article, una molti-a-molti e un uno-a-molti:Unione di risultati da belongsToMany e Pertinenti relazioni in Eloquente

public function articlesAlbums() 
{ 
    return $this->belongsToMany('Article', 'article_image', 'image_id', 'article_id')->publishedFilter(); 
} 

public function articleThumb() 
{ 
    return $this->hasMany('Article')->publishedFilter(); 
} 

ho unire i risultati da questi per ottenere tutte le immagini utilizzate per Article:

public function getArticlesAllAttribute() 
{ 
    return $this->articlesAlbums->merge($this->articleThumb); 
} 

Nel mio modello Article ho due rapporti con il mio modello Image:

public function images() 
{ 
    return $this->belongsToMany('Image', 'article_image', 'article_id', 'image_id'); 
} 

public function thumbnail() 
{ 
    return $this->belongsTo('Image', 'image_id'); 
} 

Vorrei unire questi pure, allo stesso modo che faccio nel mio modello Image:

public function getImagesAllAttribute() 
{ 
    return $this->images->merge($this->thumbnail); 
} 

Ma questo non funziona, sembra essere perché il mio rapporto miniatura è belongsTo, non hasMany . Quindi forse non è una collezione. Quando provo ottengo un'eccezione:

Call to a member function getKey() on a non-object 

Ho cercato di convertirlo in una collezione con:

new Collection($this->thumbnail) 

ma un errore che dice:

__construct() must be of the type array, object given 

Come posso unire $this->images e $this->thumbnail nel mio modello Article per ottenere gli stessi risultati che faccio nel mio modello Image? Significa che i risultati vengono uniti senza duplicati.

Molte grazie.

Aggiornamento:

Dal Razor mi ha fatto sono reso conto che $this->thumbnail non ha infatti restituire un insieme, ma piuttosto un oggetto unico che mi ha fatto ripensare se merge stato davvero la funzione corretta da utilizzare.

return $this->images->merge($this->thumbnail()->get()); 

Questo sembrava causare molte query inutili, anche se ero impaziente di caricare.

Così ho finito per fare questo, invece:

public function getImagesAllAttribute() 
{ 
    $imagesAll = $this->images; 
    if (! is_null($this->thumbnail)) $imagesAll->add($this->thumbnail); 

    return $imagesAll->unique(); 
} 

E 'drasticamente ridotto il numero di query, e il risultato è lo stesso.

+0

Partenza [questa domanda] (http://stackoverflow.com/questions/21615656/get-array-of -eloquent-modelli-relazioni). Potrebbe far luce su come arrivi al risultato. Quello che stai cercando di fare ora non funzionerà. –

risposta

6

$this->thumbnail è lo stesso $this->thumbnail()->first(), per ottenere una collezione, si può provare:

public function getImagesAllAttribute() 
{ 
    return $this->images->merge($this->thumbnail()->get()); 
} 
+0

Funziona! E ha perfettamente senso (ora che lo hai indicato). Grazie per questo :) –

+0

Benvenuto, felice di poterti aiutare. – Razor

+0

Non lo sapevo nemmeno! Grazie! – Notflip