【问题标题】:How to perform mysql functions in Yii2 query?Yii2查询中如何执行mysql功能?
【发布时间】:2017-09-07 08:20:44
【问题描述】:

当我尝试在 Yii2 查询中执行 mysql 函数时,我总是遇到语法错误。

我需要做的是选择第三列updated_at并做mysql函数,写在变量里

代码如下:

        $contractExpiryDate = 'DATE_ADD(FROM_UNIXTIME(updated_at), '
        . 'INTERVAL term_months MONTH) AS contract_expiry_date';

    $query = self::find()
        ->select([
            self::tableName() . '.*',
            Client::tableName() . '.company_name AS company_name',
            ClientService::tableName() . '.agreement_no AS agreement_no',
            ClientService::tableName() . $contractExpiryDate,
        ])->joinWith('client')
          ->joinWith('loans')
          ->orderBy('company_name');

错误信息:

SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 ') AS contract_expiry_date FROM client_profit_loss_report LEFT JOIN client ON' 附近使用正确的语法 正在执行的 SQL 是:SELECT client_profit_loss_report.*, client.company_name AS company_name, client_service.agreement_no AS agreement_no, client_serviceDATE_ADD(FROM_UNIXTIME(updated_at), INTERVAL term_months MONTH)来自client_profit_loss_report左加入client 987654334 client_id 987654335 @ client 987654337 client_profit_loss_report_loan 987654339 client_profit_loss_report_loan 987654341 client_serviceclient_profit_loss_report_loan.client_service_id = client_service.id订购company_name

谁能解释我做错了什么?

【问题讨论】:

  • 有什么问题吗(显示或记录错误)?
  • 我已经用错误更新了我的问题
  • @HELPME 我已经更新了我的答案。试试看。

标签: php mysql yii2


【解决方案1】:

这应该是适合您的代码。您需要在每个字段上引用表名:

$query = self::find()
    ->select([
        self::tableName() . '.*',
        Client::tableName() . '.company_name AS company_name',
        ClientService::tableName() . '.agreement_no AS agreement_no',
        'DATE_ADD(
            FROM_UNIXTIME(' . ClientService::tableName() . '.updated_at),
            INTERVAL ' . ClientService::tableName() . '.term_months MONTH
        ) AS contract_expiry_date',
    ])->joinWith('client')
    ->joinWith('loans')
    ->orderBy('company_name');

如果您希望根据其他评论格式化日期,您只需将 DATE_ADD 函数调用包装在 DATE_FORMAT 函数调用中,如下所示:

DATE_FORMAT(DATE_ADD('2017-09-07', INTERVAL 1 MONTH), '%Y-%m-%d');

所以你的查询是这样的:

$query = self::find()
    ->select([
        self::tableName() . '.*',
        Client::tableName() . '.company_name AS company_name',
        ClientService::tableName() . '.agreement_no AS agreement_no',
        'DATE_FORMAT(
            DATE_ADD(
                FROM_UNIXTIME(' . ClientService::tableName() . '.updated_at),
                INTERVAL ' . ClientService::tableName() . '.term_months MONTH
            ),
            '%Y-%m-%d'
        ) AS contract_expiry_date',
    ])->joinWith('client')
    ->joinWith('loans')
    ->orderBy('company_name');

【讨论】:

  • 我刚刚仔细研究了这个。如果没有有关您的数据库架构的信息,我无法就解决方案提供准确的建议。 updated_atterm_months 字段是否在 client_service 表中?
【解决方案2】:

不知道每列去哪个表,但试试这个...

$contractExpiryDate = 'DATE_ADD(FROM_UNIXTIME('. ClientService::tableName() .'.updated_at), '
    . 'INTERVAL '. ClientService::tableName() .'.term_months MONTH) AS contract_expiry_date';

$query = self::find()
    ->select([
        self::tableName() . '.*',
        Client::tableName() . '.company_name AS company_name',
        ClientService::tableName() . '.agreement_no AS agreement_no',
        $contractExpiryDate,
    ])->joinWith('client')
      ->joinWith('loans')
      ->orderBy('company_name');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 2017-03-21
    相关资源
    最近更新 更多