Cập nhật 2020
Như trong Laravel> = 5.3 , nếu ai đó vẫn tò mò làm thế nào để làm điều đó một cách dễ dàng. Nó có thể bằng cách sử dụng : updateOrCreate()
.
Ví dụ cho câu hỏi được hỏi, bạn có thể sử dụng một cái gì đó như:
$matchThese = ['shopId'=>$theID,'metadataKey'=>2001];
ShopMeta::updateOrCreate($matchThese,['shopOwner'=>'New One']);
Mã ở trên sẽ kiểm tra bảng được đại diện bởi ShopMeta, rất có thể sẽ shop_metas
trừ khi không được định nghĩa khác trong chính mô hình
và nó sẽ cố gắng tìm mục với
cột shopId = $theID
và
cột metadateKey = 2001
và nếu tìm thấy thì nó sẽ cập nhật cột shopOwner
của hàng tìm thấy thành New One
.
Nếu nó tìm thấy nhiều hơn một hàng phù hợp thì nó sẽ cập nhật hàng đầu tiên có nghĩa là có hàng chính thấp nhất id
.
Nếu hoàn toàn không tìm thấy thì nó sẽ chèn một hàng mới với:
shopId = $theID
, metadateKey = 2001
vàshopOwner = New One
Lưu ý
Kiểm tra mô hình của bạn $fillable
và thực hiện kiện rằng bạn có mọi tên cột được xác định tại đó bạn muốn chèn hoặc cập nhật và các cột còn lại có giá trị mặc định hoặc id
cột tự động tăng lên.
Nếu không, nó sẽ ném lỗi khi thực hiện ví dụ trên:
Illuminate\Database\QueryException with message 'SQLSTATE[HY000]: General error: 1364 Field '...' doesn't have a default value (SQL: insert into `...` (`...`,.., `updated_at`, `created_at`) values (...,.., xxxx-xx-xx xx:xx:xx, xxxx-xx-xx xx:xx:xx))'
Vì sẽ có một số trường sẽ cần giá trị trong khi chèn hàng mới và nó sẽ không thể thực hiện được vì nó không được xác định trong $fillable
hoặc nó không có giá trị mặc định.
Để tham khảo thêm, vui lòng xem Tài liệu của Laravel tại:
https://laravel.com/docs/5.3/eloquent
Một ví dụ từ đó là:
// If there's a flight from Oakland to San Diego, set the price to $99.
// If no matching model exists, create one.
$flight = App\Flight::updateOrCreate(
['departure' => 'Oakland', 'destination' => 'San Diego'],
['price' => 99]
);
mà khá nhiều xóa tất cả mọi thứ.
Cập nhật Trình tạo truy vấn
Ai đó đã hỏi liệu có thể sử dụng Query Builder trong Laravel không. Đây là tài liệu tham khảo cho Trình tạo truy vấn từ các tài liệu của Laravel.
Trình tạo truy vấn hoạt động chính xác giống như Eloquent, vì vậy mọi thứ đúng với Eloquent đều đúng với Trình tạo truy vấn. Vì vậy, đối với trường hợp cụ thể này, chỉ cần sử dụng cùng chức năng với trình tạo truy vấn của bạn như vậy:
$matchThese = array('shopId'=>$theID,'metadataKey'=>2001);
DB::table('shop_metas')::updateOrCreate($matchThese,['shopOwner'=>'New One']);
Tất nhiên, đừng quên thêm mặt tiền DB:
use Illuminate\Support\Facades\DB;
HOẶC LÀ
use DB;
Tôi hy vọng nó sẽ giúp
shopId
không phải là khóa chính của bạn, phải không?