Yii 2:如何在2个表之间使用ActiveRecord构建搜索查询?

hao*_*ang 4 activerecord yii2

我用了Yii 2.

要明确:

  • 两个表,即内容和任务,是1:1的关系,task.content_id = content.id;
  • 我引用了 doc.
  • 在视图文件中,我使用Gridview来显示数据.
  • 而且我想内容也是可搜索的,即使它在另一张桌子里.

也许以下的sql可以解释我想要的东西:

SELECT 
    c.content, 
    t.publish_status 
FROM 
    content c, task t 
WHERE 
    c.content LIKE '%keywordInContent%' AND
    t.publish_status = 1 AND
    c.id = t.content_id 
ORDER BY 
    updated_at 
LIMIT 20;
Run Code Online (Sandbox Code Playgroud)

这是我的控制器代码:

public function actionIndex()
{
    $searchModel = new TaskSearch;
    $dataProvider = $searchModel->search(Yii::$app->getRequest()->get());

    return $this->render('index', [
        'dataProvider' => $dataProvider,
        'searchModel' => $searchModel,
    ]);
}
Run Code Online (Sandbox Code Playgroud)

和搜索模型代码:

public function search($params)
{
    $query = Task::find()->trashed(Task::TRASHED_NO);

    $dataProvider = new ActiveDataProvider([
        'query' => $query,
    ]);

    if (!($this->load($params) && $this->validate())) {
        return $dataProvider;
    }

    $query->andFilterWhere(['publish_status' => $this->publish_status]);

    return $dataProvider;
}
Run Code Online (Sandbox Code Playgroud)

我之前通过搜索like子句并将结果content_id添加到searchModel查询来解决它,代码如下:

if (!empty($this->keyword)) {
     $contentIdArr = Content::find()->select('id')->where(['like', 'content', $this->keyword])->column();
     if (empty($contentIdArr)) {
        $contentIdArr = -1;
     }
     $query->andFilterWhere(['content_id' => $contentIdArr]);
}
Run Code Online (Sandbox Code Playgroud)

我想知道有没有办法构建我在Yii 2开始时编写的sql?

感谢帮助.

rob*_*sch 5

你能试一试吗:

public function search($params)
{
    $query = Task::find()->trashed(Task::TRASHED_NO);

    $dataProvider = new ActiveDataProvider([
        'query' => $query,
    ]);

    if (!($this->load($params) && $this->validate())) {
        return $dataProvider;
    }

    if(!empty($this->keyword))
        $query->leftJoin('content', 'content.id=task.content_id')
            ->andWhere(['publish_status' => 1])
            ->andWhere(['LIKE', 'content', $this->keyword])
            ->orderBy('updated_at');

    return $dataProvider;
}
Run Code Online (Sandbox Code Playgroud)

但是我认为updated_at不应该是搜索的一部分.这更多是关于排序.在这里看一个例子.