天道酬勤,学无止境

如何在 yii 中使用 findAll() 编写查询(How to write the query in yii,using findAll())

问题

我有以下 sql 查询,如何使用findAll()在 yii 中编写查询?

我没有使用CDbCriteria并且暂时避免使用它。

使用三个表 user、category 和 job_profile。

SELECT * 
FROM job_profile
INNER JOIN user ON user.id = job_profile.user_id
INNER JOIN category ON category.id = job_profile.category_id
WHERE category_id = 1
  AND experience = 2
  AND key_skills LIKE  '%php%'

我已经编写了以下查询,但我不知道如何包含 join:

 $results = SearchEmployee::model()->findAll("category_id=:category AND key_skills like 
:skill AND experience=:experience", array(
            'category'=>$category,
            'skill'=>'%'.$skills.'%',
            'experience'=>$experience
            ));        
回答1
$model = JobProfile::model()->with('userrelationname','categoryrelationname')->findAll(array("condition"=>"t.category_id =1 and t.experience =2 and t.key_skills LIKE '%php%'"));

您可以在 JobProfile 模型中找到关系名称

关系示例

您的 JobProfile 模型文件中会有源代码,例如

 public function relations(){
    return array(
      'user' => array (self::BELONGS_TO, 'User', 'id' ),
    )
 }

这是“用户”是关系名称...

然后在您的控制器示例中;

foreach($model as $m){
    echo $m['user_id']; // in your job_profile table
    echo $m->user->id;  // in your user table
}
回答2

您可以将 queryAll 与 create 命令一起使用。

    $query= " SELECT * 
    FROM job_profile
    INNER JOIN user ON user.id = job_profile.user_id
    INNER JOIN category ON category.id = job_profile.category_id
    WHERE category_id =1
    AND experience =2
    AND key_skills LIKE  '%php%'";

                $result= Yii::app()->db->createCommand($query)->queryAll();
回答3

你可以试试这个方法吗:

$c = array('join' => 
    array(
        'user' => array(
            'joinType' => 'INNER JOIN',
            'on' => 'user.id = t.user_id'
        ),
        'category' => array(
            'joinType' => 'INNER JOIN',
            'on' => 'category.id = t.category_id'
        ),
    ),
    'condition' => "t.category_id =1 and t.experience =2 and t.key_skills LIKE '%php%'"
);
$results = SearchEmployee::model()->findAll($c);
标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Yii-如何打印findAll使用的SQL(Yii - How to print SQL used by findAll)
    问题 我有以下代码从数据库中获取一些记录 $criteria = new CDbCriteria(); $criteria->condition = 't.date BETWEEN "'.$from_date.'" AND "'.$to_date.'"'; $criteria->with = array('order'); $orders = ProductOrder::model()->findAll($criteria); 是否有可能获得findAll使用的SQL? 我知道您可以从调试控制台获取它。 但是我正在使用yiic.php在后台运行脚本 回答1 您可以将已执行的查询记录在应用程序日志中并进行查看。 在配置文件中是这样的: 'components' => array( 'db'=>array( 'enableParamLogging' => true, ), 'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( array( 'class'=>'CFileLogRoute', 'levels'=>'trace,log', 'categories' => 'system.db.CDbCommand', 'logFile' => 'db.log', ), ), ), ); 在某些情况下(例如,运行测试时)
  • YII查询不起作用[关闭](YII queries not working [closed])
    问题 关闭。 此问题不符合 Stack Overflow 准则。 它目前不接受答案。 想改善这个问题吗? 更新问题,使其成为 Stack Overflow 的主题。 7年前关闭。 改进这个问题 我有一个大约有 700,000 行的表。 Profile::model()->findAll("country='US'") 我用它来查找所有以“美国”作为其国家的行。 但是执行停止了,我没有得到任何结果。 但后来我添加了如下限制 Profile::model()->findAll("country='US' limit 10000") 然后它起作用了。 为什么执行停止? 请帮助我.. 我是 YII 的新手。 回答1 如果您使用findAll ,则将返回所有记录而不会应用任何限制。 但是,如果您不另行说明, CActiveDataProvider自动对结果进行分页。 如评论中所述,使用findAll时可能会耗尽内存。 使用限制或分页(自动应用限制)将返回的行数降低到您的应用程序可以处理的范围。 我建议使用 CDataProviderIterator 来获取大量活动记录。 尝试以下示例代码。 $criteria = new CDbCriteria; $criteria->compare('country','US'); $Profiles = CDataProviderIterator(
  • 如何在 yii 中创建自定义自动完成文本字段(how to create custom autocomplete textfield in yii)
    问题 我是 yii 的新手。 我需要编写自定义 yii 自动完成。我知道 CJuiAutocomplete 在那里。但我需要实现自己的自定义自动完成。 任何人都可以指导我或帮助我开发自定义自动完成文本字段。 在文本字段中显示名称时获取 id。 提前致谢 回答1 这是站点控制器中的一个操作... public function actionAutoComplete($term){ $query = Yourmodel::model()->findallbyattributes( array('somecolumn'=>$term)); $list = array(); foreach($query as $q){ $data['value']= $q['id']; $data['label']= $q['name']; $list[]= $data; unset($data); } echo json_encode($list); } 这是您认为的搜索表单: $form=$this->beginWidget('CActiveForm', array( 'id'=>'searchform', 'enableAjaxValidation'=>false, 'action' => '/' )); ?> <fieldset> <div class="input-append"> <?php
  • Yii-用findAll排序(Yii - findAll with order by)
    问题 如何使用desc命令按顺序查找具有特定列的全部? 下面的代码可以正常工作,并从开发人员ID中查找所有内容 $id = Yii::app()->user->getState('id'); $models = Games::model()->findAll('developer_id='.$id); 波纹管工作并下令 $models = Games::model()->findAll(array('order'=>'status')); 当我混合在一起时,仅适用于findAll developer_id ='。$ id不排序 $id = Yii::app()->user->getState('id'); $models = Games::model()->findAll('developer_id='.$id,array('order'=>'status')); 有什么建议吗? 谢谢 回答1 在模型中,添加以下功能: public function scopes() { return array( 'bystatus' => array('order' => 'status DESC'), ); } 现在,您可以执行以下查询: $models = Games::model()->bystatus()->findAll('developer_id='.$id); ===== 奖励
  • Yii2如何执行“与”或“或”条件分组?(Yii2 How to perform where AND or OR condition grouping?)
    问题 我是Yii-2框架的新手。 我如何使用activeQuery和模型在Yii-2框架中实现以下查询。 SELECT * FROM users AS u WHERE u.user_id IN(1,5,8) AND (u.status = 1 OR u.verified = 1) OR (u.social_account = 1 AND u.enable_social = 1) 谢谢 回答1 您可以尝试以下方法: //SELECT * FROM users AS u WHERE u.user_id IN(1,5,8) AND (u.status = 1 OR u.verified = 1) OR (u.social_account = 1 AND u.enable_social = 1) $model = arname()->find() ->andWhere(['user_id'=>[1,5,8]]) ->andWhere(['or', ['status'=>1], ['verified'=>1] ]) ->orWhere(['and', ['social_account'=>1], ['enable_social'=>1] ]) ->all(); 回答2 试试这个 - $query = (new \yii\db\Query()) ->select('*') ->from(
  • Yii2-获取列的总和(Yii2 - getting sum of a column)
    问题 我在指南中找到了这个,但不知道如何实现 yii\db\Query::count(); 返回COUNT查询的结果。 其他类似的方法包括sum($q) , average($q) , max($q) , min($q) ,它们支持所谓的聚合数据查询。 $q参数对于这些方法是必需的,可以是列名或表达式。 比如说我有一个带有列的表名“ billing”: name amount charge1 110.00 charge2 510.00 Total - 620.00 我如何实现使用 yii\db\Query::sum('amount'); 我也试过像 $command = Yii::$app->db->createCommand("SELECT sum(amount) FROM billing"); yii\db\Query::sum($command); 但是页面会产生错误。 谢谢。 回答1 您尝试的代码的第一部分似乎正在尝试使用查询生成器。 在这种情况下,您必须创建查询的实例,设置目标表,然后计算总和: 通过查询生成器(http://www.yiiframework.com/doc-2.0/guide-db-query-builder.html): $query = (new \yii\db\Query())->from('billing'); $sum = $query-
  • Yii-回显最后一个查询(Yii - echo the last query)
    问题 我以前使用过Codeigniter,它具有将回显上一个数据库查询的功能-对于调试非常有用。 例如... $this->getSomeData->findAll(); Yii command to output this single query e.g SELECT * FROM TABLE... Yii是否具有类似的功能以简单地显示最后执行的查询? 回答1 在您的配置文件中尝试此操作。 您可以在页面底部看到查询和其他详细信息。 'db'=>array( 'enableProfiling'=>true, 'enableParamLogging' => true, ), 'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( … array( 'class'=>'CProfileLogRoute', 'levels'=>'profile', 'enabled'=>true, ), ), ),
  • 使用Yii查询构建器进行mysql查询(mysql query with Yii query builder)
    问题 嗨,有什么方法可以在Yii查询构建器中编写以下查询 SELECT t.email FROM otz_user_header t JOIN otz_customers r ON t.user_id = r.customer_user_id JOIN otz_customer_ratings cr ON cr.customer_user_id = r.customer_user_id WHERE r.rate_auto_approve =0 AND r.rate_email_time IS NOT NULL AND r.total_rating_count IS NOT NULL AND cr.rating_date < CURDATE( ) AND cr.rating_date >DATE_SUB( CURDATE( ) , INTERVAL 7 DAY ) 我已经使用Yii DAO方法编写了上面的查询,但是我正在寻找适合查询生成器的查询,这可能吗? 回答1 是的,肯定是。 :-)哦,你的意思是,你是怎么做到的? ;-) 从这里开始:http://www.yiiframework.com/doc/guide/1.1/en/database.query-builder $emails = Yii::app()->db->createCommand() ->select('t
  • How to write the query in yii,using findAll()
    I have the following sql query, how can I write the query in yii using findAll()? I am not using CDbCriteria and for the time being avoiding it. Using three tables user, category and job_profile. SELECT * FROM job_profile INNER JOIN user ON user.id = job_profile.user_id INNER JOIN category ON category.id = job_profile.category_id WHERE category_id = 1 AND experience = 2 AND key_skills LIKE '%php%' I have written the following queries but I do not know how to include join: $results = SearchEmployee::model()->findAll("category_id=:category AND key_skills like :skill AND experience=:experience"
  • Yii2 REST查询(Yii2 REST query)
    问题 HY。 我有一个ProductController,它扩展了yii \ rest \ ActiveController。 问题是我如何通过HTTP GET请求进行查询。 像:http://api.test.loc/v1/products/search?name = iphone 返回对象将包含所有名称为iphone的产品。 回答1 更新:2016年4月29日 这是比上一次更新中介绍的方法更简单的一种方法。 它总是涉及到由gii生成的Search类。 我喜欢用它在一个地方定义和维护所有与搜索相关的逻辑,例如使用自定义方案,处理验证或在过滤过程中涉及相关模型(如本例所示)。 所以我要回到我的第一个答案: public function actions() { $actions = parent::actions(); $actions['index']['prepareDataProvider'] = [$this, 'prepareDataProvider']; return $actions; } public function prepareDataProvider() { $searchModel = new \app\models\ProductSearch(); return $searchModel->search(\Yii::$app->request-
  • 如何使用DAO在Yii中检测事务中的最后插入ID?(How to detect the last insert ID within a transaction in Yii using DAO?)
    问题 那是源代码,我需要检测ID(请参阅下面两个查询之间的标记位置)。 $connection = Yii::app()->db; $transaction=$connection->beginTransaction(); try { $q = "INSERT INTO `someTable1` .... "; $connection->createCommand($q)->execute(); // Single Row Inserted // HERE!! How to get the last insert ID from query above $q = "INSERT INTO `someTable2` .... WHERE id = LAST_INSERT_ID_FROM_FIRST_QUERY "; $connection->createCommand($q)->execute(); $transaction->commit(); } catch (Exception $e) { // react on exception $trans->rollback(); } 最合适的方法是什么? 回答1 $lastInsertID = $connection->getLastInsertID(); 回答2 您可以尝试两种方式,这里的getLastInsertID是method
  • Yii框架中的PHP异步方法调用(PHP Asynchronous Method Call In The Yii Framework)
    问题 问题 我想知道是否有可能在动作呈现视图时从其动作之一异步调用Yii控制器方法,而使该方法完成长时间运行的操作。 我想做类似下面的代码,而无需从my_long_running_func返回结果。 public function actionCreate() { $model = new Vacancies; if (isset($_POST['Vacancies'])) { $model->setAttributes($_POST['Vacancies']); $model->save(); //I wish :) call_user_func_async('my_long_running_func',$model); } $this->render('create', array( 'model' => $model)); } 问题 我正在尝试在Yii中编写一个控制器操作,该操作将发布空缺并将该帖子通知感兴趣的订户。 问题在于执行通知查询需要花费很长时间。 现在,我正在寻找一种异步运行查询的方法,以便张贴者在尽可能短的时间内看到他的响应,而查询在后台以类似于C#委托或事件的方式运行。 我用谷歌搜索的解决方案在控制器动作过程中执行了异步请求,但我要做的就是异步运行控制器的方法,并且动作必须等到请求完成为止。 尝试过 我尝试了以下方法,但是对于约1500个用户的测试数据
  • yii2 ActiveQuery'OR LIKE'过滤器(yii2 ActiveQuery 'OR LIKE' filter)
    问题 我有一个任务-通过全名添加到搜索模型搜索。 全名是名字+姓氏。 所以我需要建立查询 WHERE first_name LIKE '%var%' OR last_name LIKE '%var%' 我能做到的唯一方法: $query->andFilterWhere([ 'OR', 'profiles.first_name LIKE "%' . $this->userFullName . '%" ', 'profiles.last_name LIKE "%' . $this->userFullName . '%"' ]); 但是我不喜欢它,因为它不安全。 我不知道如何...我认为有办法用yii2 active builder建立这样的查询,而我想得到这样的结果 $query->andFilterWhere(['LIKE', 'profiles.first_name', $this->userFullName]); $query->andFilterWhere(['OR LIKE', 'profiles.last_name', $this->userFullName]); 问题出在查询中,例如,我可以使用array作为将被映射的属性的值,但是我不能使用array作为要与之进行比较的属性的列表。 或者 $subQuery1 = Profile::find()->Where([
  • 在 Yii 框架中,如何验证电子邮件和电子邮件已存在或不检查?(How to validate email and email already exist or not check, in Yii Framework?)
    问题 如何使用 Yii 模型验证规则功能代码验证电子邮件。 还有如何使用 Yii 中的模型验证规则功能检查电子邮件是否存在。 回答1 您可以如下设置模型验证 public function rules() { // NOTE: you should only define rules for those attributes that // will receive user inputs. return array( //First parameter is your field name of table which has email value array('email', 'email','message'=>"The email isn't correct"), array('email', 'unique','message'=>'Email already exists!'), ); } Yii 参考链接了解更多详情:http://www.yiiframework.com/wiki/56/ 回答2 您可以创建自定义验证方法来满足您的要求。 在模型类中创建一个函数: public function uniqueEmail($attribute, $params) { // Set $emailExist variable true or false by using
  • 如何在Yii框架中使用mysql_escape_string()?(How to use mysql_escape_string() in Yii framework?)
    问题 众所周知,我们不能在诸如Yii之类的框架中使用原始MySQL查询。 我想在Yii框架中运行的项目中使用mysql_escape_string ,以摆脱用户输入中的SQL注入。 我知道mysql_escape_string在PHP 5.5中已弃用,并且我有PDO替代方法。 Yii框架中的替代方法是什么?还有mysql_escape_string()的PDO方法是什么? 回答1 PDO中mysql_escape_string的替代方法是使用准备好的语句。 以Yii为例: $user = Yii::app()->db->createCommand() ->select('username, password') ->from('tbl_user') ->where('id=:id', array(':id'=>$_GET['userId'])) ->queryRow(); (来自Yii参考文档http://www.yiiframework.com/doc/api/1.1/CDbCommand) 在准备好的语句中通过占位符传递参数时,可以防止SQL注入。 回答2 最好使用准备好的语句进行自动参数转义。 但是,这种CDbConnection方法也可以解决问题: Yii::app()->db->quoteValue($your_value); 本质上,这引用了一个字符串值供查询使用
  • Yii 2:如何在Kartik网格视图中批量删除数据?(Yii 2 : how to bulk delete data in kartik grid view?)
    问题 yii2中的Kartik网格视图提供了在网格视图中显示复选框的选项。 如何通过选中复选框删除批量数据? 任何帮助将是巨大的。 这是我的代码: <?php use kartik\grid\GridView;?> <?= GridView::widget([ 'dataProvider' => $dataProvider, 'filterModel' => $searchModel, 'pjax'=>true, 'pjaxSettings'=>[ 'neverTimeout'=>true, ], 'columns' => [ ['class' => '\kartik\grid\CheckboxColumn'], ['class' => 'yii\grid\SerialColumn'], 'hotel_id', 'name', 'address', 'phone_no', 'contact_person', ['class' => 'yii\grid\ActionColumn'], ], ]); ?> 回答1 试试这个,希望对您有所帮助,而不是使用此kartik\grid\CheckboxColumn使用yii\grid\CheckboxColumn 步骤1:在index.php中创建一个用于多个删除的按钮 <input type="button" class="btn btn
  • Yii2中的$ with和$ joinWith有什么区别以及何时使用它们?(What is the difference between $with and $joinWith in Yii2 and when to use them?)
    问题 在API文档中,指定了 $joinWith -关系的列表,这个查询应该与加盟 $with with-执行此查询的关系列表 这些ActiveQuery属性之间有什么区别,在什么情况下应该使用$joinWith和$with ? 回答1 with和joinWith之间的joinWith with方法一起使用会导致以下SQL查询 $users = User::find()->with('userGroup'); SELECT * FROM `user`; SELECT * FROM `userGroup` WHERE userId = ... ...在使用joinWith将导致此SQL查询 $users = User::find()->joinWith('userGroup', true) SELECT * FROM user LEFT JOIN `userGroup` userGroup ON user.`id` = userGroup.`userId`; 因此,当我需要过滤或搜索相关表中的数据时,我正在使用joinWith 。 附加信息 文档-> http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#joining-with-relations将告诉您: “使用关系数据库时
  • Yii2:如何用联合查询和排序创建ActiveDataProvider?(Yii2: How to create ActiveDataProvider with union query and sorting?)
    问题 使用Yii Framework 2.0,我有两个数据库表,如下所示。 A table: a_id = 1, name = yes, number = 123 a_id = 2, name = no, number = 456 a_id = 3, name = ok, number = 683 B table: id = 1, a_id = 1, firstname = s id = 2, a_id = 1, firstname = y id = 3, a_id = 2, firstname = e id = 4, a_id = 2, firstname = x id = 5, a_id = 2, firstname = t id = 6, a_id = 3, firstname = r 我想使用ActiveDataProvider for GridView查询这些记录,并得到如下结果。 a_id = 1, name = yes, number = 123 a_id = 1, name = s, number = null a_id = 1, name = y, number = null a_id = 2, name = no, number = 456 a_id = 2, name = e, number = null a_id = 2, name = x, number
  • “无效的参数编号:参数未定义”插入数据(“Invalid parameter number: parameter was not defined” Inserting data)
    问题 更新 列出值时,我犯了一个小错误。 我应该输入“:username”而不是“:alias”。 我想这个问题的答案是谁想要的自由统治权? 还是删除问题? 原来的 我一直在使用Yii的活动记录模式。 现在,我的项目需要为一个小事务访问另一个数据库。 我以为Yii的DAO会很好。 但是,我遇到了一个隐秘的错误。 CDbCommand无法执行SQL语句:SQLSTATE [HY093]:无效的参数编号:参数未定义 这是我的代码: public function actionConfirmation { $model_person = new TempPerson(); $model = $model_person->find('alias=:alias',array(':alias'=>$_GET['alias'])); $connection=Yii::app()->db2; $sql = "INSERT INTO users (username, password, ssn, surname , firstname, email, city, country) VALUES(:alias, :password, :ssn, :surname , :firstname, :email, :city, :country)"; $command=$connection-
  • Yii addInCondition with floats: How to ? and why addInCondition('column', array(1.1, 1.3)) don't work?
    How to addInCondition with floats? I tried a lot. This works ok: $criteria=new CDbCriteria(); $criteria->addInCondition('order_id',array(36907)); $tasks=OrderTask::model()->findAll($criteria); In my case it returns 4 models: But if I try $criteria=new CDbCriteria(); $criteria->addInCondition('order_id',array(36907)); $criteria->addInCondition('step',array(3.20)); $tasks=OrderTask::model()->findAll($criteria); Or $criteria=new CDbCriteria(); $criteria->addInCondition('step',array("3.20")); $tasks=OrderTask::model()->findAll($criteria); Or $criteria=new CDbCriteria(); $criteria->addInCondition(