2016-12-08 31 views
5

Tôi đang sử dụng Laravel và cần phải chạy truy vấn sql liệu từ một mô hình/lớp RepositoryChạy sql liệu bên trong mẫu: Laravel

INSERT INTO calendar 
(room_id, date, default_count, default_price) 
VALUES ('1', '2017-01-02', '2', '400004') 
ON DUPLICATE KEY UPDATE 
default_count = VALUES(default_count), default_price = VALUES(default_price); 

cũ. Khi tôi chèn dữ liệu từ UserRepository

$this->users->insert(['email' => '[email protected]', 'votes' => 0]); 

Tôi cần một số loại phương pháp để có được kết nối DB và chạy sql qua mô hình

//Something like 
$this->users->execute($sql); 

tôi thấy Laravel có updateOrInsert() phương pháp nhưng tôi cần phải chạy này cho nhiều dữ liệu đặt cùng một lúc.

Làm cách nào để chạy truy vấn sql thô thông qua lớp mô hình hoặc kho lưu trữ?

Cảm ơn

CẬP NHẬT - SOLVED

tôi đã đi qua Eloquent Model Sourcecode và thấy tôi có thể nhận được phương pháp()

$this->users->getConnection()->statement($sql); 
+0

Vui lòng làm rõ vấn đề cụ thể của bạn hoặc thêm chi tiết bổ sung để làm nổi bật chính xác những gì bạn cần. Như nó hiện đang được viết, thật khó để nói chính xác những gì bạn đang yêu cầu. –

+1

@ZakariaAcharki Đã cập nhật –

+0

Bạn không cần ** điều đó. Những gì bạn cần là bắt một ngoại lệ và kiểm tra xem mã của nó có chứa '23000' là mã cho mục nhập khóa trùng lặp hay không. Tại thời điểm đó, bạn chỉ cần tiến hành cập nhật mô hình của mình.Bạn có thể tạo một phương thức duy nhất trong mô hình của mình, giao dịch với chèn/bắt ngoại lệ/kiểm tra xem mã có phải là 23000 hay không và sau đó cập nhật mô hình của bạn. Bạn có thể tránh tìm nạp kết nối, giao dịch với giao dịch và tất cả những thứ khó chịu khác mà bạn muốn thực hiện. – Mjh

Trả lời

0

tôi đã đi qua hùng biện Mẫu mã nguồn và thấy tôi có thể nhận kết nối từ getConnection phương pháp()

$this->users->getConnection()->statement($sql); 

không biết statement() là cách tốt nhất để chạy sql này. Tuy nhiên nó đã hoạt động.

Cảm ơn mọi người đã trợ giúp. Ngoài ra nếu bạn có giải pháp tốt hơn, vui lòng cho tôi biết

0

Làm như thế này

$query = array(['room_id' => 1, 'date' => '2/1/2017', 'default_count' => '2', 'default_price' => '400004'], 
['room_id' => 2, 'date' => '2/1/2017', 'default_count' => '3', 'default_price' => '455004']); 


DB::table('calendar')->insart('query'); 

kết nối từ getConnection Và al vì vậy bạn có thể làm như thế này, Tạo obj của phương thức và gán giá trị

$obj_calendar = new Calendar(); 
$obj_calendar->room_id = 1; 
$obj_calendar->date = date('Y-m-d H:i:s', strtotime('2017-01-02')); 
$obj_calendar->default_count = 2; 
$obj_calendar->default_price = 400004; 
$obj_calendar->save(); 

Sử dụng giao dịch

// bắt đầu giao dịch

public function beginTransaction() 
{ 
    DB::beginTransaction(); 
} 

// thực hiện giao dịch

public function makeTransaction($query) 
{ 
    DB::transaction(function($query) use($query) 
    { 
    DB::insert($query); 
    }); 
} 

// cam kết giao dịch

public function commitTransaction() 
{ 
    return DB::commit(); 
} 

Trong phương pháp của bạn

public function insert($data) 
{ 
    $this->beginTransaction(); 

    for($i=0; $i<count($data); $i++) 
    { 
    $name = $data[$i]->first_name, "middle_name" => $data[$i]->middle_name, "last_name" => $data[$i]->last_name; 

    $query = "INSERT INTO tbl_name(id, first_name, description, created_at, updated_at) VALUES (" . $data[$i]->id . ", " . $name . ", '" . $data[$i]->description . "', '" . date("Y-m-d H:i:s",strtotime($data[$i]->created_at)) . "', '" . date("Y-m-d H:i:s",strtotime($data[$i]->created_at)) . "'); "; 

    $scraper_service->makeTransaction($query); 
    } 

    //Add last commit 
    $this->commitTransaction(); 
} 
+0

Xin lỗi tôi cần chạy hàng sql và không muốn tải lớp khác để có được kết nối bên trong mô hình –

+0

Sau đó, sử dụng giao dịch – Komal

+0

Tôi cần chạy https://github.com/laravel/framework/blob/43637b796f1ac0b1a960984231251ff04b438006/src/Illuminate/ Cơ sở dữ liệu/Eloquent/Model.php # L605-L612 nhưng đối với nhiều tập dữ liệu. Hiệu quả, tốt hơn nên chạy một truy vấn thay vì 10 truy vấn cho cùng một tác vụ –

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