2014-10-10 8 views
15

W mojej aplikacji Laravel mam model Faq. Faq model może zawierać wiele Product modele, więc klasa Faq zawiera następującą funkcję:Laravel pobierz nazwę klasy powiązanego modelu

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

W sterowniku, chciałbym być w stanie odzyskać nazwę klasy, który definiuje związek. Na przykład, jeśli mam Faq obiektu, na przykład:

$faq = new Faq(); 

Jak mogę określić nazwę klasy relacji, które w tym przypadku byłoby Product. Obecnie jestem w stanie zrobić to tak:

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

Jednak zastanawiam się, czy istnieje sposób, aby osiągnąć to samo bez konieczności faktycznego uruchomienia kwerendy.

Odpowiedz

38

Tak, istnieje sposób, aby uzyskać Powiązany model bez zapytania:

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

Będzie działać na wszystkich relacjach.

Spowoduje to zwrócenie pełnej nazwy z przestrzenią nazw. Jeśli chcesz tylko użyć nazwy bazy:

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

// generic solution 
$reflection = new ReflectionClass($className); 
$reflection->getShortName(); 
+0

getRelated to świetne znalezisko! Poprzednio używałem $ className = get_class ($ faq-> products() -> getQuery() -> getModel()); – malhal

0

Myślę, że nie możesz tego zrobić. Nie wiem, co ci to potrzebne, ale można po prostu dodać dodatkowy sposób, w którym można umieścić wszystkie swoje nazwy klasy stosunki i gdzie wrócić, który chcesz:

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

Korzystanie PHP „s Reflection API można spróbować :

$class = new ReflectionClass('Faq'); 
$method = $class->getMethod('products'); 
$startLine = $method->getStartLine(); 
$endLine = $method->getEndLine(); 
$length = $endLine - $startLine; 

$fileName = $class->getFileName(); 
if(!empty($fileName)) { 
    $fileContents = file($fileName); 
    $methodSource = trim(implode('',array_slice(file($fileName),$startLine,$length))); 
    preg_match('/\((.*)\)/', $methodSource, $m); 
    $className = $m[1]; // <-- This is the result 
} 

Twoja metoda musi napisane w tym formacie w was klasie:

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

BTW, jest to konieczne, aby to zrobić? prawdopodobnie możesz iść z prostą i łatwą odpowiedzią Marcin Nabiałek, po prostu bawiłem się po prostu.