在yii2中重用和传递多个查询的正确方法

时间:2015-12-18 06:51:11

标签: php mysql yii2

我的网站以Object为模型,ObjectSearch为searchModel。我意识到我在两个不同的控制器中已经有很多重复。例如,FirstController有这个:

$arr = Yii::$app->db->createCommand('SELECT id, name, address
        FROM hosts)->queryAll();

然后在我的网站SecondController的某些部分也需要使用相同的查询。

如何从不同的控制器一遍又一遍地重复使用该查询?

我在说这个:

public function search($params)
{
    $query = Host::find();

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

我还有另一个问题。我打算做不同的询问。进行另一个查询的最佳方法是什么?我应该用那个

吗?

public function search($params)

再次

可能会加上像这样的参数吗?

public function search($params, $cond)
{

    if ($cond == true) {
         $query = *something;
    }

    else {
         $query = *something_else;
    }
    .
    .
    .
    return $dataProvider;
}

2 个答案:

答案 0 :(得分:1)

对于常见功能,您可以创建一个帮助类

namespace myapp\myhelperdir

class MyQueryHelper
{


   public static function mySelectFunction ($param)
   {
        // your code for function
        return $yourResult;

   }

然后你可以在项目的每个部分简单地添加

来引用这些功能
use myapp\myhelperdir\MyQueryHelper

$myResult = MyQueryHelper::mySelectFunction($myParam);

答案 1 :(得分:1)

在根文件夹中,您有组件文件夹。在组件文件夹内,创建一个页面,如 UserInfoComponent.php 。此页面很常见,可以在任何地方使用。

这是目录结构

YourProjectFolder
    ->assets
    ->commands
    ->components
        ->UserInfoComponent.php
    .
    .

UserInfoComponent.php

<?php
namespace app\components;

use Yii;
use yii\base\Component;

class UserInfoComponent extends Component 
{
    .
    .
    public function getUserDetails() {
        $arr = Yii::$app->db->createCommand('SELECT id, name, address FROM hosts')->queryAll();
        return $arr;
    }
    .
    .
    .
}

现在,如何在控制器或视图中调用此函数。

控制器查看

<?
$arrValue = Yii::$app->userinfo->getUserDetails(); 
?>