数据表单模型即使存在也不会显示在控制器中(Yii 2.0.6)

Data form models is not shown in controller even if exist (Yii 2.0.6)

我的控制器中有这段代码,我想在屏幕上回显模型中数据的 JSON 结果:

public function actionIndex()
{
    $searchModel = new TestTableSearch();
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

    var_dump($dataProvider->getModels());

    echo json_encode([
        "searchModel" => $searchModel,
        "getCount" => $dataProvider->getCount(),
        "dataProvider" => $dataProvider->models
    ]);
} 

所以 $dataProvider 实际上不是空的,它包含数据(可以从 var_dump() 命令中看到),但数据没有像我期望的那样返回。

甚至 $dataProvider->getCount() 都返回有两个条目。这是我得到的输出:http://prntscr.com/8hcel9.

我有兴趣展示 dataProvider 部分,其中数组中的项目不应为空。

您需要将对象转换为数组

尝试这种方式:

use yii\helpers\ArrayHelper;

......
public function actionIndex()
{
    $searchModel = new TestTableSearch();
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

    var_dump($dataProvider->getModels());

    echo json_encode([
        "searchModel" => $searchModel,
        "getCount" => $dataProvider->getCount(),
        "dataProvider" => ArrayHelper::toArray($dataProvider->models),  // object to Array 
   ]);
} 

这个和Yii关系不大。这只是一个 PHP 问题。你可以这样解决(根据this):

echo "<pre>";
echo json_encode([
    "searchModel" => json_readable_encode($searchModel),
    "getCount" => $dataProvider->getCount(),
    "dataProvider" => json_readable_encode($dataProvider->models)
]);
echo "</pre>";

function json_readable_encode($in, $indent = 0, $from_array = false) {
    $_myself = __FUNCTION__;
    $_escape = function ($str) {
        return preg_replace("!([\b\t\n\r\f\"\'])!", "\\\1", $str);
    };

    $out = '';

    foreach ($in as $key => $value) {
        $out .= str_repeat("\t", $indent + 1);
        $out .= "\"" . $_escape((string)$key) . "\": ";

        if (is_object($value) || is_array($value)) {
            $out .= "\n";
            $out .= $_myself($value, $indent + 1);
        } elseif (is_bool($value)) {
            $out .= $value ? 'true' : 'false';
        } elseif (is_null($value)) {
            $out .= 'null';
        } elseif (is_string($value)) {
            $out .= "\"" . $_escape($value) . "\"";
        } else {
            $out .= $value;
        }

        $out .= ",\n";
    }

    if (!empty($out)) {
        $out = substr($out, 0, -2);
    }

    $out = str_repeat("\t", $indent) . "{\n" . $out;
    $out .= "\n" . str_repeat("\t", $indent) . "}";

    return $out;
}