2014-10-10 17 views
15

Laravel uygulamasında Faq modeline sahibim. Bir Faq modeli birçok Product modellerini içerebilir, böylece Faq sınıf aşağıdaki işlevi içerir: bir denetleyici olarakLaravel ilgili modele ait sınıf adı olsun.

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

, ben ilişkiyi tanımlayan sınıf adını almak mümkün olmak istiyorum. Böyle bir Faq nesne, varsa Örneğin,:

$faq = new Faq(); 

nasıl bu durumda Product olacağını ilişki, sınıf adını belirleyebilir. Şu anda böyle yapmak mümkün duyuyorum: aslında bir sorgu çalıştırmak zorunda kalmadan bu aynı şeyi gerçekleştirmek için bir yol olup olmadığını

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

Ancak, merak ediyorum.

cevap

38

Evet, sorgu olmadan ilgili modelini almak için bir yolu yoktur.

Tam ad, ad alanıyla birlikte döner. Eğer sadece taban adı kullanmak istediğinizde:

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

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

getRelated harika bir keşif! Daha önce $ className = get_class ($ faq-> products() -> getQuery() -> getModel()) kullanıyordum; – malhal

0

Sanırım bunu yapamazsınız. Sana Bunun için gerekenler bilmiyorum ama sadece tüm ilişkileri sınıf adını koymak ve birini iade nereye istediğiniz ekstra yöntemini ekleyebilirsiniz:

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

Bunu deneyebilirsiniz PHP 'ın Reflection API kullanma : size sınıfında bu formatta yazılı

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

Yöntemin zorunluluk: BTW

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

, bunu yapmak için gerekli mi? Muhtemelen Marcin Nabiałek 'un basit ve kolay cevabı ile gidebilir, sadece etrafta oynuyordum.

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

Tüm ilişkiler için çalışacaktır: