Trần Hà Nguyễn

đã thích câu trả lời

Sau khi tìm hiểu một hồi thì mình đã tìm ra giải pháp:


Đối với MacOs:


  1. Mở MySQL từ System Preferences > Initialize Database >
  2. Gõ mật khẩu mới
  3. Chọn 'Use legacy password'
  4. Khởi động lại server.
  5. Kết nối lại bằng Sequel Pro















Trần Hà Nguyễn

Magento không connect được với mysql trong docker?
Trần Hà Nguyễn đã trả lời

Bạn thử thêm dòng này vào docker-compose.yml


mysql:
  image: mysql
  ports:
      - "3307:3306"
  command: mysqld --default-authentication-plugin=mysql_native_password
  volumes:
      - ./mysql-data/:/var/lib/mysql/
  environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=magento
  hostname: mysql
  container_name: mysql






Trần Hà Nguyễn

đã thích câu trả lời

Sau khi ngâm cứu thì mình đã tìm ra giải pháp:

Sửa file Validator trong vendor folder

vendor\magento\Framework\View\Element\Template\File\Validator.php

Thêm vào dưới dòng 138

$realPath = str_replace('\\', '/',$this->fileDriver->getRealPath($path));

Sau đó chạy các lệnh sau:


php bin/magento cache:clean
php bin/magento cache:flush
php bin/magento setup:upgrade


Xóa dữ liệu các thư mục:

pub/static/frontend/* pub/static/adminhtml/* var/cache/ var/generation/ var/page_cache/ var/view_preprocessed/ var/composer_home generated/


Chạy tiếp lệnh:

php -dmemory_limit=6G bin/magento setup:static-content:deploy -f


Phân quyền 777 2 thư mục:

pub/ var/


Sau đó chạy lệnh:

php bin/magento cache:clean


Ok, vậy là đã chạy ngon lành!


Trần Hà Nguyễn

Magento2 cài đặt bị lỗi 404 không load được các file js, css trong thư mục pub/static
Trần Hà Nguyễn đã trả lời

Sau khi ngâm cứu thì mình đã tìm ra giải pháp:

Sửa file Validator trong vendor folder

vendor\magento\Framework\View\Element\Template\File\Validator.php

Thêm vào dưới dòng 138

$realPath = str_replace('\\', '/',$this->fileDriver->getRealPath($path));

Sau đó chạy các lệnh sau:


php bin/magento cache:clean
php bin/magento cache:flush
php bin/magento setup:upgrade


Xóa dữ liệu các thư mục:

pub/static/frontend/* pub/static/adminhtml/* var/cache/ var/generation/ var/page_cache/ var/view_preprocessed/ var/composer_home generated/


Chạy tiếp lệnh:

php -dmemory_limit=6G bin/magento setup:static-content:deploy -f


Phân quyền 777 2 thư mục:

pub/ var/


Sau đó chạy lệnh:

php bin/magento cache:clean


Ok, vậy là đã chạy ngon lành!





Trần Hà Nguyễn

đã thích câu trả lời

Bạn có thể tham khảo qua cách sử dụng cú pháp CASE trong SQL. Với yêu cầu bài toán của bạn thì thử cách sau nhé. Tuy nhiên khi số lượng bản ghi của bảng products quá lớn, bạn nên tách ra thành từng phần như khoảng 1000, 2000 id để update.

$cases = [];
$ids = [];
$params = [];

foreach ($updateData as $id => $value) {
    $id = (int)$id;
    $cases[] = "WHEN {$id} then ?";
    $params[] = $value;
    $ids[] = $id;
}

$ids = implode(',', $ids);
$cases = implode(' ', $cases);
$now = \Carbon\Carbon::now(); //ví dụ là 2019-06-08 09:47:38

DB::update("UPDATE `products` SET `view_count` = CASE `id` {$cases} END, `updated_at` = \"{$now}\" WHERE `id` in ({$ids})", $params);

Query từ câu lệnh trên sẽ tương đương với câu SQL như sau:

"UPDATE `products` SET `view_count` = CASE `id` WHEN 1 then ? WHEN 2 then ? WHEN 3 then ? WHEN 4 then ? WHEN 5 then ? END, `updated_at` = "2019-06-08 09:47:38" WHERE `id` in (1,2,3,4,5)"

Với dữ liệu ví dụ bạn đưa ra, câu SQL với params được truyền vào cụ thể sẽ là:

"UPDATE `products` SET `view_count` = CASE `id` WHEN 1 then 20 WHEN 2 then 35 WHEN 3 then 60 WHEN 4 then 82 WHEN 5 then 350 END, `updated_at` = "2019-06-08 09:47:38" WHERE `id` in (1,2,3,4,5)"

Trần Hà Nguyễn

đã thích câu trả lời

Có thể sử dụng một số cách như sau:

UPDATE products p
JOIN (
    SELECT 1 as id, 5 as product_view_count
    UNION ALL
    SELECT 2, 10
    UNION ALL
    SELECT 3, 8
    UNION ALL
    SELECT 4, 10
) vals ON p.id = vals.id
SET view_count = product_view_count;

Hoặc:

INSERT INTO products 
    (id, view_count)
VALUES 
    (1, 5),
    (2, 10),
    (3, 8),
    (4, 10)
ON DUPLICATE KEY UPDATE 
    view_count = VALUES(view_count);

P/S: Lười chưa thử nhưng chắc sẽ ok


Trần Hà Nguyễn

Làm thế nào để update nhiều bản ghi với danh sách id và giá trị của một trường tương ứng
Trần Hà Nguyễn đã trả lời

Có thể sử dụng một số cách như sau:

UPDATE products p
JOIN (
    SELECT 1 as id, 5 as product_view_count
    UNION ALL
    SELECT 2, 10
    UNION ALL
    SELECT 3, 8
    UNION ALL
    SELECT 4, 10
) vals ON p.id = vals.id
SET view_count = product_view_count;

Hoặc:

INSERT INTO products 
    (id, view_count)
VALUES 
    (1, 5),
    (2, 10),
    (3, 8),
    (4, 10)
ON DUPLICATE KEY UPDATE 
    view_count = VALUES(view_count);

P/S: Lười chưa thử nhưng chắc sẽ ok



Trần Hà Nguyễn

đã thích câu trả lời

Từ phiên bản 5.2 trở đi, nếu bạn dùng config:cache thì bạn chỉ có thể sử dụng hàm env trong file config.

Nếu muốn sử dụng ngoài phạm vi các file config thì bạn sử dụng hàm config thay vì sử dụng env.


Chi tiết tham khảo tại đây.