2011-09-24 17 views

Trả lời

9

Hãy xem hàm db_merge(), tôi nghĩ rằng nó có các tính năng bạn đang tìm kiếm.

1

Nếu bạn thực sự không biết liệu đã có bản ghi chưa, bạn có thể cần kiểm tra sớm hơn một chút trong luồng chương trình của mình. Thông thường tôi sẽ bắt đầu chức năng hoặc bất cứ điều gì với một cuộc gọi đến DB và nếu tôi không nhận được một đối tượng hồ sơ hiện có, tôi thực hiện một cái mới từ stdClass.

Điều này có hai lợi ích: trước tiên, điều đó có nghĩa là bạn biết về dữ liệu hiện có, vì vậy bạn có thể sử dụng dữ liệu đó nếu cần và không ghi đè lên một cách mù quáng. Thứ hai: khi bạn đến điểm mà bạn viết cho DB, bạn biết đó là INSERT hoặc UPDATE dựa trên việc đối tượng có thuộc tính id hay không.

+0

tôi mỗi khi tạo ra kỷ lục với hai khóa chính (không có ai là tự động tăng), vì vậy tôi không thể kiểm tra hồ sơ mà không cần kiểm tra ở trong DB. Tôi nghĩ cách dễ nhất là lần đầu tiên cố gắng xóa bản ghi và chèn. Nhưng tôi sợ về chi phí trên bàn ... – neworld

+0

Ý của bạn là khóa tổng hợp? Điều này sẽ không tạo sự khác biệt với phương pháp tôi đã nêu. Chỉ cần làm một SELECT * với sự kết hợp của các lĩnh vực trong một mệnh đề WHERE và xem những gì trở lại. Có bất kỳ trường nào khác trong bảng ngoài các trường bạn đang sử dụng cho khóa (tức là đây là bảng kết nối nhiều người tham gia) không? –

+0

Tôi có một truy vấn đơn giản. Vì vậy, tôi viết chức năng phổ quát bản thân mình, bởi vì tôi cần nó thường xuyên. – neworld

1

tôi thực hiện chức năng bản thân mình:

function drupal_write_record2($table, $data, $primaryKeys) { 
    $data = (array)$data; 

    $query = db_select($table) 
     ->fields($table); 

    if (is_array($primaryKeys)) 
     foreach ($primaryKeys as $key) 
     $query->condition($key, $data[$key]); 
    else 
     $query->condition($primaryKeys, $data[$primaryKeys]); 

    $update = (bool)$query->execute()->fetchAssoc(); 

    if ($update) 
     return drupal_write_record($table, $data, $primaryKeys); 
    else 
     return drupal_write_record($table, $data); 
}