【问题标题】:Yii CDbCriteria sqlYii CDbCriteria sql
【发布时间】:2012-07-31 07:01:14
【问题描述】:

我正在开发基于 Yii 的应用程序。我要转换这条 SQL:

SELECT m.sendDate, m.status, c.name, c.email, mt.name, mt.subject, CONCAT( op.firstName,  ' ', op.lastName ) operator
FROM  `mail` m, client c, mailTemplate mt, operator op
WHERE m.customerID = c.id
AND m.operatorID = op.id
AND m.templateID = mt.id
AND c.name LIKE  '%L%'
AND c.email LIKE  '%@gmail.com%'
AND m.sendDate <  '2012-07-31'
AND m.sendDate >  '2012-06-30'

进入 CDBcriteria 但不知道如何。

【问题讨论】:

    标签: php yii


    【解决方案1】:

    首先,您必须创建 4 个模型:Mail、Client、MailTemplate、Operator。

    在邮件模型中定义关系:

    public function relations()
    {
        return array(
            'client' => array(self::BELONGS_TO, 'Client', 'customerID'),
            'operator' => array(self::BELONGS_TO, 'Operator', 'operatorID'),
            'mailTemplate' => array(self::BELONGS_TO, 'MailTemplate', 'templateID'),
        );
    }
    

    还有……

    $criteria = new CDbCriteria;
    $criteria->select = new CDbExpression('t.sendDate, t.status, client.name, client.email, mailTemplate.name, mailTemplate.subject, CONCAT( operator.firstName,  " ", operator.lastName ) operator');
    $criteria->addSearchCondition('client.name', 'L', true);
    $criteria->addSearchCondition('client.email', '@gmail.com', true);
    $criteria->compare('mailTemplate.sendDate', '<2012-07-31');
    $criteria->compare('mailTemplate.sendDate', '>2012-06-30');
    

    好了,现在我们可以找到物品了:

    $mails = Mail::model()->with(array('client', 'operator', 'mailTemplate'))->findAll($criteria);
    

    第二个问题的更新:

    在您的邮件模型中定义方法搜索:

    public function search()
    {
        /* Criteria from my first answer */
        return new CActiveDataProvider('Mail', array(
            'criteria' => $criteria,
        ));
    }
    

    在gridview中,列必须使用关系 $data 是具有关系的邮件模型的一项。

    'columns' => array(
        array(
            'name' => 'prop_defined_in_mail_model',
            'value' => '$data->client->id',
        ),
    ),
    

    【讨论】:

    • 我还有一个问题。如何在 CGridView 中显示来自 4 个不同模型的信息?
    • 来自 Mail、Client、MailTemplate 和 Operator?
    • 现在我有这个错误ctive record "Mail" is trying to select an invalid column "t.sendDate, t.status, client.name, client.email, mailTemplate.name, mailTemplate.subject, CONCAT( operator.firstName, " ", operator.lastName ) operator". Note, the column must exist in the table or be an expression with alias.
    • @n_yanev 问题与CONCAT( operator.firstName, " ", operator.lastName ) operator
    • @n_yanev 想法:选择是:$criteria-&gt;select = '*'; 并在 CGridView 中使用 PHP 进行 concat。这将更容易,更有效率
    猜你喜欢
    • 2012-10-28
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多