Yii - 如何从另一个模型获取数据

时间:2015-11-27 02:13:47

标签: php mysql sql-server yii

早上好

如何从其他模型获取数据? 我有一个搜索字段,我需要搜索项目名称。然后我的Cgridview将显示所选项目。

我的关系中有这个

public function relations() {
        return array(
            'project' => array(self::BELONGS_TO, 'RmProjects', 'project_id'),
        );
    }

我想在我的模型中的搜索功能中访问project_name。

public function search($employee, $search_date_start, $search_date_end, $search) {

        $criteria = new CDbCriteria;
        $criteria->with = array('eval' => array('together' => true));

        $criteria->compare('employee_id', $this->employee_id);
        $criteria->compare('remarks', $this->remarks, true);
        $criteria->compare('eval_id', $this->eval_id);

        //I tried it like this
        $criteria->addSearchCondition('project.project_name', $search);           

        if ($employee != '') {
            $criteria->compare('t.employee_id', $employee->company_id);
        }    
        return new CActiveDataProvider($this, array(
            'criteria' => $criteria,
        ));
    }

当我这样做时,我收到错误。

  

CDbCommand无法执行SQL语句:SQLSTATE [42S22]:   未找到列:1054未知列'project.project_name'在'其中   条款'。执行的SQL语句是:SELECT COUNT(DISTINCT   tid)FROM trx_evaluation_details t LEFT OUTER JOIN   trx_evaluation eval ON(teval_id = evalid)WHERE   ((project.project_name LIKE:ycp0)

我的代码出了什么问题。我尝试在我当前的模型中连接RmProject模型,以便我可以访问project_name ..但是,我得到了这个错误。请帮忙..

这是一个编辑:

这是我的整个关系部分

 public function relations() {
        return array(
            'eval' => array(self::BELONGS_TO, 'Evaluation', 'eval_id'),
            'project' => array(self::BELONGS_TO, 'RmProjects', 'project_id'),
        );
    }

我在我的模型中添加了这个,但它仍然无效。它只是改变了表格。

$criteria->with = array('project' => array('together' => true));     
$criteria->addSearchCondition('project.project_name', $search);

这是我的搜索功能。

public function search($employee, $search_date_start, $search_date_end, $search) {            
        $criteria = new CDbCriteria;
        $criteria->with = array('eval' => array('together' => true));
        $criteria->with = array('project' => array('together' => true));                       

        $criteria->compare('employee_id', $this->employee_id);
        $criteria->compare('remarks', $this->remarks, true);
        $criteria->compare('eval_id', $this->eval_id);            

        $criteria->addSearchCondition('project.project_name', $search);
        $criteria->addSearchCondition('start_date', $search_date_start, 'AND');
        $criteria->addSearchCondition('end_date', $search_date_end, 'AND');

        if ($employee != '') {
            $criteria->compare('t.employee_id', $employee->company_id);
        }    

         if ($search_date_end !== '' && $search_date_start !== '' && $search !== '') {
                $criteria->condition = "start_date  >= '$search_date_start' AND end_date <= '$search_date_end' AND project.project_name like '%$search%'AND t.employee_id = '$employee->company_id'";                
            }

        return new CActiveDataProvider($this, array(
            'criteria' => $criteria,
        ));
    }

enter image description here

2 个答案:

答案 0 :(得分:0)

您没有为搜索方法添加模型

$criteria->together = true;
$criteria->with = array('eval','project');
$criteria->addSearchCondition('project.project_name', $search);

通过方法的属性设置搜索值也不是一个好的解决方案。定义新模型公共属性,定义规则并在搜索中使用它。

public $project_name;

public function attributeLabels(){
   return array(
       //... your other labels there
       'project_name' => 'Project Name',
   );
}

public function rules(){
   return array(
      //... your other rules there
      array('project_name', 'safe', 'on' => 'search'),
   );
}

public function search(){
   $criteria->compare('project.project_name', $this->project_name);
}

答案 1 :(得分:0)

我已经解决了这个问题。

在我的关系()中,我添加了这一行

'project' => array(self::HAS_ONE, 'RmProjects', array ('project_id'=>'project_id'), 'through'=> 'eval'),

这会加入具有通过另一个模型的连接的模型。然后你可以从另一个模型中获取数据..我希望这个答案可以帮助任何与我有同样问题的人。

你可以在这里阅读..这是关系查询中使用 http://www.yiiframework.com/doc/guide/1.1/en/database.arr#relational-query-with-through