【问题标题】:Yii - How to get data from another modelYii - 如何从另一个模型中获取数据
【发布时间】:2016-03-01 04:24:42
【问题描述】:

早安

如何从另一个模型中获取数据。? 我有一个搜索字段,我需要在其中搜索项目名称。然后我的 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' 在 'where 条款'。执行的 SQL 语句是:SELECT COUNT(DISTINCT t.id) FROM trx_evaluation_details t 左外连接 trx_evaluation eval ON (t.eval_id=eval.id) 在哪里 ((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,
        ));
    }

【问题讨论】:

  • 错误很明显。生成的sql中没有项目表。您需要使用 t.project_name 或 eval.project_name 取决于哪个表包含列 - project_name。
  • project_name 在另一个模型中,这是我在我的关系中尝试过的 RmProject。

标签: php mysql sql-server yii


【解决方案1】:

我已经解决了这个问题。

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

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

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

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

【讨论】:

    【解决方案2】:

    您没有将模型添加到您的搜索方法中

    $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);
    }
    

    【讨论】:

    • $criteria->together = true; $criteria->with = array('eval','project'); $criteria->addSearchCondition('project.project_name', $search); 我试过这样做,但这不会加入另一个表,而是用 rm_projects 替换 trx_evaluation,它现在返回它无法识别 start_date 的错误和 end_date 因为这些数据来自 trx_evaluation 表。
    • 你的问题是关于 project 关系的错误,所以我给你一个解决方案。正如我所看到的,您也没有指定要使用的“评估”关系。
    • 嗨@SiZE 感谢您的回复以及您耐心解答我的问题。我编辑了我的帖子并添加了我的代码。如您所见,我有两个需要的关系。 my project_name 所在的 project 和我的 start_dateend_date 所在的 eval位于..
    • @litlitDM 您两次分配给with 参数时犯了一个错误。再看看我的第一个代码示例。
    • 另外别忘了设置别名evalproject
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    相关资源
    最近更新 更多