【问题标题】:How to use the value of array inside DB raw Laravel如何在 DB raw Laravel 中使用数组的值
【发布时间】:2019-08-26 09:19:47
【问题描述】:

您好,我对 Laravel 中的 DB raw 有疑问。实际上,现在我有一个名为 $currencies 的变量,其结构如下。

<?php

$currencies = [
    'CNY' => 1000,
    'USD' => 10000
]

我需要使用该数组的值对我的产品表进行排序。 products 表如下所示:

| id  |  product_name  | original_currency  | price |
|  1  | lorem ipsum d  | CNY                | 20    |
|  2  | new product n  | USD                | 10    |

到目前为止,我的代码如下所示:


$products = DB::raw(SELECT product_name, 
                           price, 
                           price * $currencies[original_currency] AS converted_price 
                    FROM products);

但我收到了错误Undefined Index: original_currency

我只需要访问正确的值来设置converted_price。所以预期的结果是这样的:

| id  |  product_name  | original_currency  | price |  converted_price  |
|  1  | lorem ipsum d  | CNY                | 20    |  20000            |
|  2  | new product n  | USD                | 10    |  1000000          |

【问题讨论】:

标签: php mysql laravel laravel-5


【解决方案1】:

问题:

  • 将查询作为字符串传递,查询周围缺少单引号或双引号。
  • 您不能在查询中直接使用 PHP 数组,因为查询被发送到 MySQL 服务器并且它无法访问您的 PHP 变量。

解决方案:

方法一:从 MySQL 中获取简单数据,在 PHP 中修改数据

    $products = DB::raw('SELECT products.product_id, products.original_currency, products.price FROM products);

    foreach($products as $key => $value) {
        $value['converted_price'] = $value['price'] * $currencies[$value['original_currency']];
    }

方法二:在 MySQL 中使用 Temp 表:

    SELECT 
        products.product_id,
        products.price,
        products.price * weight_table.weight AS converted_price
    FROM products
    INNER JOIN (
        SELECT 'CNY' AS currency, 100 AS weight
        UNION
        SELECT 'USD' AS currency, 1000 AS weight
    ) AS weight_table 
        ON products.original_currency = weight_table.currency;

如果您在 PHP 中有动态货币数组,请使用以下代码生成内部临时表。

$currencies = [
    'CNY' => 100,
    'USD' => 1000
];

function getTempTable($arrCurrency) {
    $arrQuery = [];
    foreach($arrCurrency as $key => $value) {
        $arrQuery[] = "SELECT '" . $key . "' AS currency, " . $value . " AS weight";
    }

    return implode(PHP_EOL. " UNION " . PHP_EOL, $arrQuery); 
}

$strQuery = 'SELECT 
    products.product_id,
    products.price,
    products.price * weight_table.weight AS converted_price
FROM products
INNER JOIN ( ' . getTempTable($currencies) . ') AS weight_table
    ON products.original_currency = weight_table.currency';

$products = DB::raw($strQuery);

【讨论】:

  • 该解决方案看起来不错,但这可能会使用Illuminate\Database\Query\Builder 类上的宏来简化。
猜你喜欢
  • 2015-10-27
  • 2019-11-28
  • 2015-11-20
  • 2018-10-24
  • 2018-01-24
  • 2018-07-06
  • 2023-03-24
  • 2018-03-15
  • 1970-01-01
相关资源
最近更新 更多