【问题标题】:Cant get the value from database with inner join using yii framework使用 yii 框架无法通过内部连接从数据库中获取值
【发布时间】:2014-05-23 05:59:04
【问题描述】:

我无法使用带有内部连接的 yii 框架从数据库中选择值。我的控制器是 sitecontroller.php,视图文件是 adavance_search_result.php。我收到错误“

属性“Job.location”未定义。

C:\wamp\www\yii\framework\db\ar\CActiveRecord.php(145) "

工作表字段

id             int (100)            
user_id        int(100)         
posted_by      varchar(100) 
title          varchar(100) 
key_skills     varchar(200) 
no_vacancy     int(11)          
category_id    int(11)              
experience     int(11)          
contact_email  varchar(100)         
company_name   varchar(100)         
salary         double               
location_id    int int(100)

位置 1.id 2.标题

我的控制器代码是

  public function actionadvance_search_result() {
     $title = $_GET['title'];
     $experience = $_GET['experience'];
     $location = $_GET['location'];
     $category = $_GET['category'];
     $salary_min = $_GET['salary_min'];
     $salary_max = $_GET['salary_max'];

     $criteria = new CDbCriteria();
     $criteria->select = 't.title,  location.title,  t.key_skills, t.description, t.no_vacancy, t.experience, t.company_name, t.salary';
     $criteria->join = 'INNER JOIN location ON t.location_id = location.id';
     if($experience != "") {
        $criteria->addCondition("(title like '%$title%' or  key_skills like '%$title%') and (experience like '%$experience%')");
     }
     if($location != "") {
        $criteria->addCondition("location_id like '%$location%'");
     }

     if($category != "") {
        $criteria->addCondition("category_id like '%$category%'");
     }
     if($salary_min != "" && $salary_max != "") {
        $criteria->addCondition("salary >= '$salary_min' and salary <= '$salary_max'");
     }

     $count = Job::model()->count($criteria);
     $pages = new CPagination($count);
     $pages->pageSize = 2;
     $pages->applyLimit($criteria);
     $model = Job::model()->findAll($criteria);

     $number_rec = count($model);
     if($number_rec <= 0) {
        $this->render('search_result1', array('model' => $model));
     }
     else {
        $this->render('advance_search_result', array(
                                                    'model' => $model,
                                                    'pages' => $pages
                                               ));
     }
  }

我的查看页面是

  <div>
     <div>
        <h1>Search Results</h1>
        <ul style="list-style:none; ">
           <?php
           foreach($model as $models) {
              $job_id = $models->id;
              ?>
              <li>
                 <p><?php echo CHtml::link($models->title); ?></p>
                 <p><?php echo CHtml::link($models->location->title); ?></p>
                 <p><?php echo $models->company_name; ?></p>
                 <p><?php echo $models->description; ?></p>
                 <p>Keyskill:<?php echo $models->key_skills; ?><p>
              </li>
              </br>
           <?php
           }
           ?>
        </ul>
        <p><?php $this->widget('CLinkPager', array(
                                                  'pages' => $pages,
                                             )) ?></p>
     </div>
  </div>

模型是job.php

代码

<?php

  class Job extends CActiveRecord
{
 public $title;
 public static function model($className=__CLASS__)
 {

return parent::model($className);
 }
public function tableName()
{
    return 'jobs';
}

public function rules()
{

return array(
          array('title,key_skills,description,no_vacancy,
category_id,experience,contact_email,company_name,company_name,salary,location_id','required'),
    );
}
public function relations()
  {
 return array(
'location' => array(self::HAS_MANY, 'location', 'id'),
 );
  }
public function attributeLabels()
{
    return array(
        'user_id' => 'User_ID',
        'title' => 'Title',
        'key_skills' => 'Key_skills',
    );
}
public function search()
{
    $criteria=new CDbCriteria;
    $criteria->compare('id',$this->id);
    $criteria->compare('title',$this->title);
    $criteria->compare('key_skills',$this->key_skills,true);
    return new CActiveDataProvider($this, array(
        'criteria'=>$criteria,
    ));
}
}

?>

模型位置.php

 <?php
 class Location extends CActiveRecord
 {
  public $title;
 public $Ltitle;
 public static function model($className=__CLASS__)
  {
 return parent::model($className);
  }
public function tableName()
{
    return 'location';
}

 public function rules()
{
    return array(
        array('title,description','required'),
    );
}
public function relations(){
   return array(
'job' => array(self::BELONGS_TO, 'Job', 'id'),
);    
}

}
?>

有人帮帮我吗?

【问题讨论】:

  • 作业表有哪些列?
  • 我已经添加了工作表字段,更新了上面的代码,请检查一下。
  • 请检查更新的代码,我有两个表作业和位置,两个表都有字段名称'title'。所以我使用了别名。
  • 你有一个使用 (title like '%$title%' 的 addCondition -- 那不应该是 (ltitle like '%$title%' 吗?
  • 在工作表中的'title'字段查询中使用了倾斜,位置是在工作表中使用'location_id'搜索。我想要工作表中的'title'和位置表中的'title'。跨度>

标签: php yii


【解决方案1】:

添加并查看是否有效

$criteria->with = array(
    'location'
);

【讨论】:

    【解决方案2】:

    Job 和 Location 表有关系吗? 如果是,那么为什么不使用 yii 中的关系。与您相比,它非常易于使用。所以我的建议是,如果表有主键和外键这样的关系,那么在 yii 中使用 Gii 模块创建模型。

    然后你只做

    $criteria = new CDbCriteria();
    $criteria->select = array('t.title,location.title as ltitle');
    $criteria->with = array('location');
    if($location != "") {
     $criteria->compare('t.theField_name' , $someThing);
    }
    $getValues = Job::model()->findAll($criteria);
    
    foreach($getValues as $val){
        echo $val->location->title;//title from location table.
        echo $val->title;//title from job table.
    }
    

    您还在工作中添加了一些东西,下面的位置模型是详细信息。

    首先将以下代码添加到工作模型文件中

    //Job Model.
    public function relations()
    {
    //NOTE: you may need to adjust the relation name and the related
    // class name for the relations automatically generated below.
    return array(
        'location' => array(self::HAS_MANY, 'Location', 'id'),
    );
    }
    

    然后将以下代码添加到您的位置模型文件中

    public function relations(){
      // NOTE: you may need to adjust the relation name and the related
      // class name for the relations automatically generated below.
      return array(
     'job' => array(self::BELONGS_TO, 'Job', 'id'),
      );    
    }
    

    还要确保位置表中设置了主键和作业表location_id的id字段作为外键。

    希望这会对您有所帮助。 :)

    【讨论】:

    • job 表中的location_id 是位置表的id
    • 您也可以尝试使用 $val->location->title 从位置表中获取标题。并且从工作表获取标题你应该写 $val->title.
    • 现在我的错误是'未定义属性“Job.location”'
    • 你能把你的整个代码贴出来让我看看然后帮忙解决吗?
    • 你必须用我的代码替换下面的代码 $criteria = new CDbCriteria(); $criteria->select = 't.title, location.title, t.key_skills, t.description, t.no_vacancy, t.experience, t.company_name, t.salary'; $criteria->join = 'INNER JOIN location ON t.location_id = location.id';.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    相关资源
    最近更新 更多