2014-10-10 14 views
15

मेरे लैरावेल एप्लिकेशन में मेरे पास Faq मॉडल है। एक Faq मॉडल कई Product मॉडल हो सकते हैं, इसलिए Faq वर्ग निम्नलिखित समारोह में शामिल है:लार्वेल को संबंधित मॉडल का वर्ग नाम

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

एक नियंत्रक में, मैं वर्ग के नाम उस रिश्ते को परिभाषित करता है पुनः प्राप्त करने में सक्षम होना चाहते हैं। उदाहरण के लिए, अगर मैं एक Faq वस्तु, इस तरह है:

$faq = new Faq(); 

मैं कैसे संबंध है, जो इस मामले में Product होगा की वर्ग के नाम निर्धारित कर सकते हैं। वर्तमान में मैं इस तरह यह करने के लिए कर रहा हूँ:

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

हालांकि, मैं अगर वहाँ वास्तव में एक क्वेरी चलाने के लिए बिना इस एक ही बात को पूरा करने के लिए एक रास्ता है सोच रहा हूँ।

उत्तर

38

हाँ, वहाँ एक रास्ता क्वेरी के बिना संबंधित मॉडल प्राप्त करने के लिए है।

यह नामस्थान के साथ पूरा नाम वापस कर देगा। यदि आप केवल आधार नाम का उपयोग करना चाहते हैं:

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

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

getRelated एक शानदार खोज है! पहले मैं $ className = get_class ($ faq-> उत्पादों() -> 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'); 
} 

BTW, यह यह करने के लिए आवश्यक है? शायद आप Marcin Nabiałek के सरल और आसान उत्तर के साथ जा सकते हैं, मैं बस इतना ही खेल रहा था।

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

यह सब संबंधों के लिए काम करेंगे:

संबंधित मुद्दे