2016-09-01 19 views
6

Trong các phiên bản trước của CakePHP, bạn có thể tạm thời thay đổi liên kết với Table::bindModel('SomeModel'); nhưng tôi không thể tìm ra cách thực hiện trong v3.Cách xóa liên kết khi đang di chuyển trong CakePHP v3

Tôi muốn tạm thời vô hiệu hóa liên kết hasMany được xác định trong lớp Bảng vì nó gây ra lỗi khi tôi chạy các lần di chuyển cũ hơn được viết trước khi bảng đó tồn tại. Tôi không hoàn toàn hiểu được vấn đề di chuyển nhưng nó ngay lập tức biến mất khi tôi nhận xét sự liên kết trong lớp Bảng.

class AgenciesTable extends Table 
{ 
    public function initialize(array $config) 
    { 
     parent::initialize($config); 

     $this->table('agencies'); 
     $this->displayField('full_name'); 
     $this->primaryKey('id'); 
     $this->addBehavior('Timestamp'); 

     $this->hasMany('Routes'); 

enter image description here

+1

Nó chỉ là một đoán nhưng tôi nghĩ rằng nó không được thực hiện trong cake3. Lý do có thể là bánh không thực sự gọi mối quan hệ cho đến khi bạn 'chứa' bảng trong một cuộc gọi find(). Vì vậy, nếu không có lệnh find() có chứa route ake thì sẽ không kiểm tra sự tồn tại của bảng đó. – arilia

Trả lời

1

Vấn đề ở đây là bạn nên không dựa vào các lớp mô hình thực tế khi sử dụng di cư. Điều này có thể gây ra chính xác loại vấn đề bạn vừa gặp phải.

Thay vì sử dụng đối tượng TableRegistry hoặc Table trực tiếp và tạo đối tượng bảng mà không có bất kỳ phụ thuộc nào. Tải các liên kết bạn cần trực tiếp trên đối tượng đó.

$agencies = new Table(['table' => 'agencies', /*...*/]); 
$agencies->belongsTo('Whatever'); 
/* Do your data manipulation */ 

Cách di chuyển này sẽ hoạt động bất kể những thay đổi khác đã được thực hiện cho lớp AgenciesTable của bạn. Và đây là IMHO cách thích hợp để làm điều đó trong di cư.

Tôi nghĩ rằng ngay cả khi bạn không tạo liên kết rõ ràng bằng cách gọi $this->hasMany('Routes'); bạn sẽ kết thúc với cùng một lỗi vì trình tải mong muốn sẽ vẫn cố gắng tìm một lớp bảng phù hợp và tải động. Đây cũng là lý do tại sao không có phương pháp "không tự chủ".

Ngoài ra, bạn không hiển thị mã truy vấn thực tế ... Vì vậy, tôi giả sử bạn đang gọi một phương thức hoặc phương thức tùy chỉnh gọi Query :: contains() ở đâu đó. Chỉ cần viết một truy vấn mới mà không có chứa?

$agencies->find()->contain(['One', 'Two'])->where([/*...*/])->all(); 

Nếu bạn có một truy vấn lớn nó có thể là một ý tưởng tốt để phá vỡ nó thành tùy chỉnh hơn tìm thấy bởi vì họ có thể kết hợp:

$agencies->find('withoutMyContain')->all(); 
$agencies->find('withoutMyContain')->find('withMyContain')->all(); 

Xem Custom Finder Methods.

+0

Cảm ơn! Chúng tôi đang nhận được lỗi đơn giản từ mã boilerplate mà bạn nhận được khi bạn nướng di chuyển. Không có thêm fanciness. Tôi nghĩ rằng cách giải quyết của bạn sẽ hoạt động. Nhưng tôi tự hỏi nếu vấn đề ban đầu là một lỗi. Có vẻ như một tình huống rất phổ biến để tạo ra một di cư sau đó đôi khi xuống đường giới thiệu một hiệp hội mới ... Điều đó một mình không nên phá vỡ quyền di cư trước đó? – emersonthis

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