Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

CakePHP 1.3 - Cột không xác định trong mệnh đề where

Bạn nên hết sức cẩn thận với mối quan hệ mà bạn đang theo đuổi. Khi nhìn lướt qua một số câu trả lời trong số này, chúng dường như gợi ý bạn chỉ cần thêm một phép nối vào mô hình Email vào mô hình Người của bạn và dựa vào các điều kiện tìm thấy của bạn để đảm bảo truy vấn của bạn không chiếm dụng bộ nhớ máy chủ của bạn.

Tôi sẽ giả định rằng trước hết, bạn muốn mối quan hệ Email này là ẩn trong tất cả các truy vấn của bạn về Person, nếu không, bạn có thể chỉ cần chỉ định tham gia vào mỗi truy vấn bạn muốn. Trong trường hợp này, bạn chắc chắn muốn liên kết nó bằng cách sử dụng mối quan hệ kiểu mẫu .

Mã của bạn cho thấy rằng Shooting và ShootingPlacement (giả sử đây là một mô hình để lập mô hình mối quan hệ) cả hai đều thuộc về hai mô hình. Ngẫu nhiên, Chụp belongsTo Khí thải - mà chúng ta chưa thấy ở đây. Tôi cho rằng điều này không áp dụng cho trường hợp hiện tại.

Bây giờ, hãy giả sử điều tồi tệ đó vì bảng Email của bạn có khóa ngoại , nó sẽ là một hasOne mối quan hệ, chứ không phải là hasMany - vì vậy đó là những gì bạn cần để liên kết nó bằng. Tôi sẽ liên kết nó với mô hình ShootingPlacement vì đây là mô hình bạn đang truy vấn, vì vậy nó phải là điểm trung tâm mà tại đó các mô hình được kết hợp xung quanh nó. Cấu trúc khôn ngoan, bởi vì mọi thứ dường như bắt nguồn từ mô hình Người của bạn, tôi sẽ phải đề xuất bạn truy vấn that mô hình thay thế. Nhưng cách nó được thiết lập cho đến nay sẽ cho phép bạn truy vấn từ hầu hết mọi nơi và vẫn truy xuất hầu hết cùng một thanh kết quả, một vài tên mô hình và bí danh bảng.

Hoàn toàn là do khóa ngoại của bạn giữa Email và ShootingPlacement có tên khác và CakePHP 1.3 không xử lý điều này tốt lắm, tôi cũng khuyên bạn không nên sử dụng khóa ngoại, thay vào đó hãy đặt nó vào mối quan hệ dưới dạng điều kiện .

class ShootingPlacement extends AppModel
{
    var $name = 'ShootingPlacement';
    var $actsAs = array('Containable');

    var $hasOne = array(
        'Email' => array(
            'className' => 'Email',
            'foreignKey' => false,
            'conditions' => array(
                'Email.shooting_placement_id = ShootingPlacement.id',
                'Email.person_id = ShootingPlacement.person_id'
            )
        )
    );

    var $belongsTo = array (
        'Person' => array (
            'className' => 'Person',
            'foreignKey' => 'person_id',
            'order' => 'lastname ASC'
        ),
        'Shooting' => array (
            'className' => 'Shooting',
            'foreignKey' => 'shooting_id'
        )
    );
}

Tôi cũng đã thêm các hành vi có thể chứa trong đó. Điều này cho phép bạn kiểm soát từ mỗi truy vấn những mô hình được liên kết nào mà bạn muốn trả về cùng với kết quả mô hình chính của mình. Nó sẽ mặc định cho tất cả, nhưng có thể hữu ích khi bạn chỉ muốn một cái gì đó cụ thể và / hoặc vì lý do bộ nhớ (những loại truy vấn này có thể phá hủy bộ nhớ máy chủ của bạn khá nhanh nếu bạn không giới hạn chúng hoặc chỉ chỉ định tên trường bạn muốn trở lại).

Bây giờ khi bạn tạo mô hình Email của mình, tôi sẽ không khuyên bạn nên làm phức tạp thêm mớ mô hình vướng víu này bằng cách liên kết lại nó với ShootingPlacement. Như bạn đã nói, nó cũng có một khóa ngoại đối với mô hình Person. Vì vậy, bạn có thể muốn thực hiện chính xác điều tương tự như trên đối với mô hình Person của bạn (tất nhiên là thay đổi các điều kiện để phản ánh khóa ngoại Person). Bằng cách này, mô hình của bạn linh hoạt hơn một chút; nó sẽ vẫn tham gia vào ShootingPlacement Person và cũng sẽ cho phép bạn truy vấn riêng nếu được yêu cầu mà không có các mô hình liên quan khác.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP PDO - Hàng số

  2. Truyền tên bảng làm tham số của câu lệnh đã chuẩn bị

  3. Sự khác biệt giữa cơ sở dữ liệu SQL &NoSQL - So sánh MySQL &MongoDB

  4. Truy vấn bảng kết hợp bên trong cập nhật MySQL

  5. MySQL bù đắp các hàng vô hạn