2011-12-22 27 views
6

Tôi đang cố gắng lấy dữ liệu từ nhiều bảng và tôi đã kết thúc với lỗi này: SQL: SQLSTATE [42S22]: Cột không tìm thấy: 1054 Cột không xác định 'p.firstname' trong 'danh sách trường'Cột không xác định - nhiều kết nối trong CDbCriteria

$criteria = new CDbCriteria; 
    $criteria->select = 'ohu_id, hash, p.firstname, p.surname, p.city, u.email AS Email'; 
    $criteria->join = 'LEFT JOIN `profiles` p ON p.user_id = user_id'; 
    $criteria->join = 'LEFT JOIN users u ON user_id = u.id'; 
    $criteria->condition = 'offer_id = :oID'; 
    $criteria->params = array(':oID' => $_GET['id']); 

    $model = MyModel::model()->findAll($criteria); 

Bất kỳ ai biết tôi đang làm gì sai? Hoặc có cách nào tốt hơn để lấy dữ liệu liên quan không?

Trả lời

18

Bạn đang mắc phải sai lầm tương tự mà tôi đã tạo ra hehe.

Bạn đang ghi đè lần kết hợp đầu tiên với số thứ hai, thay vì nối tham gia thứ hai.

$criteria->join = "join ...."; //first join 
$criteria->join .= "join ...."; //second join 

cổ vũ

3

Sẽ tốt hơn nếu bạn hiển thị cấu trúc cơ sở dữ liệu của mình. Nhưng ở đây đó là giải pháp để tham gia nhiều bảng sử dụng trái tham gia

Mã để tham gia bảng:

$criteria->select = 'ohu_id, hash, p.firstname, p.surname, p.city, u.email AS Email'; 
$criteria->alias = 'c'; 
$criteria->join = 'LEFT JOIN profiles p ON (p.user_id = c.user_id) LEFT JOIN users u ON (c.user_id = u.id)'; 

Hy vọng nó sẽ giúp bạn.

7

Trên thực tế theo cách của mình tốt hơn để sử dụng một số "với" khoản như thế này:

$criteria->with = array(
    'profiles '=>array(
     'select'=>'profiles.user_id', 
     'together'=>true 
    ), 
    'users'=>array(
      'select'=>'users.id', 
      'together'=>true 
    ) 
); 

Bạn có thể sử dụng điều này cũng trong mô hình tìm kiếm CGridView DataProvider.

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