Việc sử dụng Model và Collection của Magento cung cấp một cách tuyệt vời để truy cập và sửa đổi dữ liệu. Sử dụng các phương thức được đặt tên trong Magento 2 đã loại bỏ đi công việc viết mã SQL thuần phức tạp. Điều đó có vẻ như là một điều tuyệt vời nhưng đôi khi, trong một vài trường hợp bạn không thể sử dụng model hoặc collection cho một nhiệm vụ khó nhằn mà xếp giao cho bạn. Thì bạn có thể thay thế bằng các câu truy vấn SQl trực tiếp trong class của bạn.
Khởi tạo đối tượng ResourceConnection
Trong constructor nơi bạn muốn thực hiện truy vấn, hãy khởi tạo class ResourceConnection hoặc bạn cũng có thể khởi tạo thông qua Object Manager.
1 2 3 4 5 6 7 8 |
protected $resourceConnection; public function __construct( \Magento\Framework\App\ResourceConnection $resourceConnection ) { $this->resourceConnection = $resourceConnection; } |
Tạo truy vấn SQL
Nói là truy vấn SQL nhưng thực ra đa số các hàm SQL đã được Magento hỗ trợ. Ví dụ:
1 2 3 |
$connection = $this->resourceConnection->getConnection(); $tableName = $this->resourceConnection->getTableName('vimagento_table'); $sql = $connection->select()->from(array('vi' => $tableName), array('*')); |
Ở trên các bạn lưu ý rằng table chúng ta nên lấy từ hàm getTableName phòng trường hợp nếu bạn có cấu hình table prefix thì hàm này sẽ tự động thêm prefix vào trước tên table cho bạn. Câu lệnh trên tương ứng với mã SQL sau:
SELECT vi .* FROM vimagento_table as vi |
Điều kiện where
1 |
$sql->where('status = ?', 1); |
Điều kiện OR
1 |
$sql->orWhere('status = ?', 4); |
hoặc bạn cũng có thể viết như thế này cũng được:
1 |
$sql->where(new \Zend_Db_Expr("(name like '%vimagento%' OR store like '%le van long%')")); |
Sắp xếp (order by)
1 |
$sql->order('name ASC'); |
Giới hạn (limit)
1 |
$sql->limit(5); |
Group by
1 |
$sql->group('id'); |
Chắc chắn là còn một số hàm nữa, nhưng hiện tại mình chưa tổng hợp được và mình sẽ update sau nhé.
Lấy dữ liệu từ truy vấn
Lấy tất cả dữ liệu từ câu truy vấn:
1 |
$data = $connection->fetchAll($sql); |
Lấy tất cả dữ liệu từ câu truy vấn dưới dạng một mảng kết hợp:
1 |
$data = $connection->fetchAssoc($sql); |
Lấy column đầu tiên của tất cả dòng dữ liệu và trả về một mảng
1 |
$data = $connection->fetchCol($sql); |
Trả về tất cả các dòng dữ liệu từ câu truy vấn dưới dạng một mảng với key-value
1 |
$data = $connection->fetchPairs($sql); |
Lấy dòng đầu tiên từ kết quả của câu truy vấn:
1 |
$data = $connection->fetchRow($sql); |
Lấy column đầu tiên của dòng đầu tiên từ kết quả của câu truy vấn:
1 |
$data = $connection->fetchOne($sql); |
Các bạn có thể sử dụng $sql->__toString() để xem câu lệnh SQL như thế nào. Và đây là class đầy đủ của mình:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
protected $resourceConnection; public function __construct( \Magento\Framework\App\ResourceConnection $resourceConnection ) { $this->resourceConnection = $resourceConnection; } public function execute() { $connection = $this->resourceConnection->getConnection(); $tableName = $this->resourceConnection->getTableName('vimagento_table'); $sql = $connection->select()->from(array('vi' => $tableName), array('*')); $sql->where('status = ?', 1); $sql->where(new \Zend_Db_Expr("(name like '%vimagento%' OR store like '%le van long%')")); $sql->order('name ASC'); $sql->group('id'); $data = $connection->fetchAll($sql); } |
Kết luận
Vừa rồi tôi đã hướng dẫn các bạn cách sử dụng truy vấn SQL trong Magento 2. Các bạn có thể xem thêm bài viết bên dưới để biết thêm về cách join các table với nhau trong Magento 2. Thanks.
Bài viết: Cách sử dụng join trong Magento 2
ra thêm nhiều bài nữa nhé a