2014-10-10 3 views
15

В моем приложении Laravel у меня есть модель Faq. Faq модели может содержать много Product моделей, поэтому Faq класса содержит следующие функции:Laravel получить название класса родственной модели

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

В контроллере, я хотел бы иметь возможность получить имя класса, который определяет отношения. Например, если у меня есть Faq объект, например:

$faq = new Faq(); 

Как я могу определить имя класса отношений, которое в данном случае было бы Product. В настоящее время я в состоянии сделать это следующим образом:

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

Однако, мне интересно, если есть способ сделать это то же самое, не имея на самом деле выполнить запрос.

ответ

38

Да, есть способ, чтобы получить соответствующую модель без запроса:

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

Он будет работать для всех отношений.

Это вернет полное имя с пространством имен. Если вы хотите использовать только базовое имя:

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

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

getRelated - отличная находка! Раньше я использовал $ className = get_class ($ faq-> products() -> getQuery() -> getModel()); – malhal

0

Я думаю, вы не можете этого сделать. Я не знаю, что вам это нужно, но вы можете просто добавить дополнительный метод, где вы положили все ваше имя класса отношений и где вы возвращаетесь, который вы хотите:

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

Использование PHP «ы Reflection API вы можете попробовать это :

$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 
} 

Ваш метод должен записать в таком формате в вас классе:

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

Кстати, это надо делать? возможно, вы можете пойти с простым и легким ответом Marcin Nabiałek, я просто играл вокруг него.

Смежные вопросы