web-dev-qa-db-fra.com

Obtenez un tableau des relations du modèle Eloquent

J'essaie d'obtenir un tableau de toutes les associations de mon modèle. J'ai le modèle suivant:

class Article extends Eloquent 
{
    protected $guarded = array();

    public static $rules = array();

    public function author() 
    {
        return $this->belongsTo('Author');
    }

    public function category() 
    {
        return $this->belongsTo('Category');
    }
}

À partir de ce modèle, j'essaie d'obtenir le tableau suivant de ses relations:

array(
    'author',
    'category'
)

Je cherche un moyen de retirer ce tableau du modèle automatiquement.

J'ai trouvé this définition d'une méthode relationsToArray sur un modèle Eloquent, qui semble renvoyer un tableau des relations du modèle. Il semble utiliser l'attribut $ this-> relations du modèle Eloquent. Cependant, cette méthode retourne un tableau vide et l'attribut relations est un tableau vide, bien que mes relations soient correctement configurées.

A quoi servent $ this-> relations sinon pour stocker les relations de modèle? Existe-t-il un moyen d'obtenir automatiquement un tableau des relations de mon modèle?

22
tprsn

Ce n'est pas possible car les relations ne sont chargées que lorsqu'elles sont demandées en utilisant with (pour un chargement rapide) ou en utilisant la méthode publique de relation définie dans le modèle, par exemple, si un modèle Author est créé avec ce qui suit relation

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

Lorsque vous appelez cette méthode comme:

$author = Author::find(1);
$author->articles; // <-- this will load related article models as a collection

De plus, comme je l'ai dit with, lorsque vous utilisez quelque chose comme ceci:

$article = Article::with('author')->get(1);

Dans ce cas, le premier article (avec l'ID 1) sera chargé avec son modèle connexe Author et vous pouvez utiliser

$article->author->name; // to access the name field from related/loaded author model

Donc, il n'est pas possible d'obtenir les relations comme par magie sans utiliser la méthode appropriée pour le chargement des relations, mais une fois que vous avez chargé la relation (modèles associés), vous pouvez utiliser quelque chose comme ceci pour obtenir les relations:

$article = Article::with(['category', 'author'])->first();
$article->getRelations(); // get all the related models
$article->getRelation('author'); // to get only related author model

Pour les convertir en array, vous pouvez utiliser la méthode toArray() comme:

dd($article->getRelations()->toArray()); // dump and die as array

La méthode relationsToArray() fonctionne sur un modèle chargé avec ses modèles associés. Cette méthode convertit les modèles associés sous forme de tableau où la méthode toArray() convertit toutes les données d'un modèle (avec relation) en tableau, voici le code source:

public function toArray()
{
     $attributes = $this->attributesToArray();

     return array_merge($attributes, $this->relationsToArray());
}

Il fusionne les attributs de modèle et ses attributs de modèle liés après la conversion en tableau, puis le renvoie.

34
The Alpha

utilisez ceci:

class Article extends Eloquent 
{
    protected $guarded = array();

    public static $rules = array();

    public $relationships = array('Author', 'Category');

    public function author() {
        return $this->belongsTo('Author');
    }

    public function category() {
        return $this->belongsTo('Category');
    }
}

Donc, en dehors de la classe, vous pouvez faire quelque chose comme ceci:

public function articleWithAllRelationships()
{
    $article = new Article;
    $relationships = $article->relationships;
    $article = $article->with($relationships)->first();
}
4
Johnson Oluwadele