web-dev-qa-db-fra.com

Laravel récupère le nom de classe du modèle associé

Dans mon application Laravel j'ai un modèle Faq. Un modèle Faq peut contenir de nombreux modèles Product, donc le Faq classe contient la fonction suivante:

class Faq extends Eloquent{ 
    public function products(){
        return $this->belongsToMany('Product');
    }
}

Dans un contrôleur, je voudrais pouvoir récupérer le nom de classe qui définit la relation. Par exemple, si j'ai un objet Faq, comme ceci:

$faq = new Faq();

Comment puis-je déterminer le nom de classe de la relation, qui dans ce cas serait Product. Actuellement, je peux le faire comme ceci:

$className = get_class($faq->products()->get()->first());

Cependant, je me demande s'il existe un moyen d'accomplir la même chose sans avoir à exécuter une requête.

28
flyingL123

Oui, il existe un moyen d'obtenir un modèle associé sans requête:

$className = get_class($faq->products()->getRelated());

Cela fonctionnera pour toutes les relations.

Cela renverra le nom complet avec l'espace de noms. Dans le cas où vous souhaitez simplement utiliser le nom de base:

// laravel helper:
$baseClass = class_basename($className);

// generic solution
$reflection = new ReflectionClass($className);
$reflection->getShortName();
73
Jarek Tkaczyk

Je pense que vous ne pouvez pas faire ça. Je ne sais pas pour quoi vous en avez besoin, mais vous pouvez simplement ajouter une méthode supplémentaire où vous mettez tout le nom de votre classe de relations et où vous en retournez un que vous voulez:

public function getRelationsClassName($relation) {
    $relations = [
        'products' => 'Product',
        'users' => 'User',
    ]  
    return isset($relations[$relation]) ? $relations[$relation] : null;
}
0
Marcin Nabiałek