Yii2从相关模型中获取价值

时间:2016-11-23 12:38:22

标签: php yii2 relational-database

我已经构建了这个yii2应用程序,其中我有一个名为客户的模型,另一个名为订单,其中customer_id是订单

我创建了一个名为 SendEmail 的操作,该操作在订单索引页面中使用,我需要根据以下内容获取订单发送到的电子邮件: customer_id。

那么如何根据客户获取当前订单的电子邮件?

客户模式:

<?php

namespace app\models;

use Yii;

class Customer extends \yii\db\ActiveRecord
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'customer';
    }
public function rules()
{
    return [
        [['Name'], 'required'],
        [['Archive', 'Credit'], 'integer'],
        [['Address'], 'string'],
        [['Name', 'Email'], 'string', 'max' => 50],
        [['Tel'], 'string', 'max' => 14],
        [['Category'], 'string', 'max' => 25],
    ];
}

/**
 * @inheritdoc
 */
public function attributeLabels()
{
    return [
        'Id' => 'ID',
        'Name' => 'Name',
        'Tel' => 'Tel',
        'Email' => 'Email',
        'Archive' => 'Archive',
        'Credit' => 'Credit',
        'Address' => 'Address',
        'Category' => 'Category'
    ];
}

/**
 * @return \yii\db\ActiveQuery
 */
public function getOrders()
{
    return $this->hasMany(Order::className(), ['Customer_Id' => 'Id']);
}
}

以下是控制器中的操作:

public function actionSendEmail($id)
{
    //Here I should get the email according to the customer_id

    if ($model->load(Yii::$app->request->post())) 
    {

            $value= Yii::$app->mailer->compose()
            ->setFrom (['smth@hotmail.com'=>'Smth'])
            ->setTo ($model->Email)
            ->setSubject ("Price Offer")
            ->setHtmlBody ("Test")
            ->send();

        $model->save();
        return $this->redirect(['view','id'=>$model->id]);}
        else
            return $this -> render('create',['model'=>$model,]);
    } 

2 个答案:

答案 0 :(得分:1)

您还需要在Order模型类中声明关系:

<?php

namespace app\models;

use Yii;

class Order extends \yii\db\ActiveRecord
{
    ... Some code here ...

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getCustomer()
    {
        return $this->hasOne(Customer::className(), ['Id' => 'Customer_Id']);
    }
}

这样你就可以得到这样的电子邮件:

$email = $order->customer->Email;

答案 1 :(得分:0)

如果您在模型中定义关系,在这种情况下,您可以轻松地使用关系从海关到订单访问相关数据,或者反过来使用。

您需要做的就是访问从模型实例到相关模型的关系作为属性。 例如,如果您有costumer实例并需要订单,请执行以下操作:

$customer->orders[i]->[property or method of the related model you demand access]

(请注意,上面的i是客户要求订单的索引,因为关系是one to many,客户可能有多个订单。)

如果您有其中一个订单,并且您需要访问订购它的客户,请执行以下操作:

$order->customer->[property or method of the related model you demand access]

P.S:在两个模型中定义关系始终是一个好习惯,在这种情况下,在customerorder模型中定义关系。

通过查看This Document,您可以在Yii2中了解关系及其定义。