2014-10-10 15 views
15

Trong ứng dụng Laravel của tôi, tôi có một mô hình Faq. Một mô hình Faq có thể chứa nhiều Product mô hình, vì vậy lớp Faq chứa các chức năng sau:Laravel lấy tên lớp của mô hình liên quan

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

Trong một bộ điều khiển, tôi muốn để có thể lấy lại tên lớp định nghĩa các mối quan hệ. Ví dụ, nếu tôi có một đối tượng Faq, như thế này:

$faq = new Faq(); 

Làm thế nào tôi có thể xác định tên lớp của mối quan hệ, mà trong trường hợp này sẽ là Product. Hiện tại tôi có thể thực hiện như sau:

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

Tuy nhiên, tôi tự hỏi có cách nào để thực hiện điều tương tự này mà không phải thực sự chạy truy vấn hay không.

Trả lời

38

Vâng, có một cách để có được mô hình có liên quan mà không cần truy vấn:

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

Nó sẽ làm việc cho tất cả các mối quan hệ.

Điều này sẽ trả về tên đầy đủ với không gian tên. Trong trường hợp bạn chỉ muốn sử dụng tên cơ sở:

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

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

getRelated là một tìm kiếm tuyệt vời! Trước đây tôi đã sử dụng $ className = get_class ($ faq-> products() -> getQuery() -> getModel()); – malhal

0

Tôi nghĩ bạn không thể làm điều đó. Tôi không biết những gì bạn cần nó cho, nhưng bạn chỉ có thể bổ sung thêm phương pháp mà bạn đặt tất cả tên lớp quan hệ của bạn và nơi bạn quay trở lại một trong những bạn muốn:

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

Sử dụng PHP 's Reflection API bạn có thể thử này :

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

phương pháp bắt buộc bạn viết bằng định dạng này trong bạn lớp:

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

BTW, là này cần thiết để làm điều đó? có lẽ bạn có thể đi với câu trả lời đơn giản và dễ dàng của Marcin Nabiałek, tôi chỉ chơi quanh tho.

Các vấn đề liên quan