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.
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à. –