2014-12-11 27 views
6

Đây là mô hình của tôi:Cập nhật tên bảng trong thời gian chạy không hoạt động - laravel hùng biện ORM

class Product extends \GlobalModel { 
    protected $table = 'product'; 
} 

Tôi muốn cập nhật tên bảng oops_product thay sản phẩm khi chạy.

Tôi tìm thấy getTable(); để có được tên bảng từ mô hình và làm việc của mình tốt:

$tableName = with(new Product)->getTable(); 

Nhưng khi tôi đặt tên bảng sử dụng settable(); theo giải pháp GitHub, nó không cập nhật tên bảng.

with(new Product)->setTable("oops_produdct"); 

Có gì không ổn?

Trợ giúp sẽ được đánh giá cao.

chỉnh sửa:

$product = new Product(); 
$product->getTable(); // output: product 
$product->setTable("oops_product"); 
$product->getTable(); // output: oops_product 

bây giờ khi tôi chạy này

$product->all(); 

nó thực thi

"select * from product" 

thay vì

"select * from oops_product" 
+0

vì lĩnh vực $ bảng là 'protected' –

+0

cố gắng này cũng nhưng không làm việc. –

+0

và bạn đã mở rộng lớp Eloquent thay vì \ GlobalModel?! –

Trả lời

13

all() là phương pháp tĩnh sử dụng phiên bản hoàn toàn mới và gọi get() trên đó.

Vì vậy, tất cả bạn cần là sử dụng phương pháp thích hợp:

$product = new Product; 
$product->getTable(); // products 
$product->setTable('oooops'); 
$product->get(); // select * from oooops 
$product->first(); // select * from oooops limit 1 
etc... 

Chỉ cần tránh sử dụng các phương pháp hùng biện tĩnh, kể từ khi họ rõ ràng là tạo thể hiện mới, mà sẽ có tài sản table mặc định.

+1

thanx rất nhiều @Jarek Tkaczyk hiện đang hoạt động. –

+0

Trong khi phương pháp này hoạt động khi bạn khởi tạo truy vấn như chọn, nó không thành công khi bạn thay đổi $ product ('$ product-> someProp = 'xyz';) và muốn lưu nó sau (' $ product-> save());), như bảng của cá thể $ product bạn nhận được từ bộ sưu tập ví dụ thông qua 'first()' sẽ không được đặt thành bảng của cá thể đã được sử dụng cho vùng chọn. Để làm được điều này, bạn phải ghi đè newInstance của mô hình của bạn để nó có thể được hydrat hóa đúng cách bao gồm cả tên bảng. – Stefan

+0

@Stefan trường hợp sử dụng là gì? Mặc dù tôi đã cung cấp câu trả lời, bây giờ tôi nhìn vào nó, tôi không thực sự thấy bất kỳ lý do gì để sử dụng bản thân mình, vì vậy tự hỏi thiết lập nào đòi hỏi những phần ghi đè như vậy? –

3

Vấn đề với câu trả lời được chấp nhận là, việc sửa đổi thể hiện mô hình đã truy xuất và sau đó lưu nó sẽ không hoạt động. Xem bình luận của tôi ở trên.

Đặc điểm sau cho phép truyền tên bảng trong quá trình hydrat hóa.

trait BindsDynamically 
{ 
    protected $connection = null; 
    protected $table = null; 

    public function bind(string $connection, string $table) 
    { 
     $this->setConnection($connection); 
     $this->setTable($table); 
    } 

    public function newInstance($attributes = [], $exists = false) 
    { 
     // Overridden in order to allow for late table binding. 

     $model = parent::newInstance($attributes, $exists); 
     $model->setTable($this->table); 

     return $model; 
    } 

} 

Dưới đây là làm thế nào để sử dụng nó:

class Product extends Model 
{ 
    use BindsDynamically; 
} 

Áp dụng cho câu trả lời được chấp nhận:

$product = new Product; 
$product->getTable(); // products 
$product->bind('connection', 'oooops'); 
$product->get(); // select * from oooops 
$product->first(); // select * from oooops limit 1 
etc... 
$product->myTestProp = 'test; 
$product->save(); // now saves into oooops 
Các vấn đề liên quan