0

ミニ地理位置情報システムの検索モデルを作成しようとしていました。GeoData モデルを直接呼び出してデータを並べ替えようとしたときはいつでも、並べ替えを試みない限り機能します。

しかし、CustomMade SearchModel を使用しようとすると、次のメッセージが送信されます: foreach() に無効な引数が指定されました

検索モデルは次のとおりです。

<?php namespace app\models;
use Yii;
use yii\base\Model;
use yii\data\ActiveDataProvider;
use app\models\GeoData;
/**
 * This is the ActiveQuery class for [[GeoData]].
 *
 * @see GeoData
 */
class GeoDataSearch extends GeoData
{
    const TODOS = 1;
    const FECHA = 2;
    const ENVIADO_POR = 3;

    public function rules()
    {
         return [
            [['latitude', 'longitude'], 'required'],
            [['latitude', 'longitude', 'accuracy', 'speed', 'betterlocation'], 'number'],
            [['device_id', 'active', 'sended', 'mobildate', 'created_at', 'updated_at', 'created_by'], 'integer'],
            [['created_by'], 'exist', 'skipOnError' => true, 'targetClass' => User::class, 'targetAttribute' => ['created_by' => 'id']],
        ];
    }
    /*public function active()
    {
        return $this->andWhere('[[status]]=1');
    }*/

    public function scenarios()
    {
        return Model::scenarios();
    }
    public function search($params)
    {
        $query = GeoData::find()->where(['created_by' => $params])->all();

            $dataProvider = new ActiveDataProvider([
                'query' => $query,
                'sort' => [
                    'defaultOrder' => [
                        'created_at' => SORT_DESC,
                    ]
                ]
                
            ]);
        
        $dataProvider->sort->attributes['created_at'] = [
            'asc' => ['created_at' => SORT_ASC],
            'desc' => ['created_at' => SORT_DESC]
        ];
        $dataProvider->sort->attributes['created_by'] = [
            'asc' => ['created_by' => SORT_ASC],
            'desc' => ['created_by' => SORT_DESC]
        ];
        $dataProvider->sort->attributes['geo_id'] = [
            'asc' => ['geo_id' => SORT_ASC],
            'desc' => ['geo_id' => SORT_DESC]
        ];

        $this->load($params);
   
        $query->andFilterWhere([
            'geo_id' => $this->geo_id,
            'latitude' => $this->latitude,
            'longitude' => $this->longitude,
            'accuracy' => $this->accuracy,
            'speed' => $this->speed,
            'device_id' => $this->device_id,
            'betterlocation' => $this->betterlocation,
            'active' => $this->active,
            'mobiledate' => $this->mobildate,
            'sended' => $this->sended,
            'updated_at' => $this->updated_at,
            'created_at' => $this->created_at,
            'created_by' => $this->created_by,
        ]);

        return $dataProvider;

    }

}

そしてコントローラー(コメントされているコードは機能しますが、GridViewもフィルターもSortも使用できません:

public function actionView($id)
    {
        $title = "Ver Historial";
        $id = $_GET['id'];
        $searchModel = new GeoDataSearch;
        
        $dataProvider = $searchModel->search($id);
        return $this->render(
            'view',
            [
                'title' => $title,
                'searchModel' => $searchModel,
                'dataProvider' => $dataProvider
        ]);
/*
        if (Yii::$app->user->can(AuthItem::ROLE_ADMINISTRATOR))
        {
        $id = $_GET['id'];
        $title = "Ver Historial";
        $model = new GeoData;
        $dataProvider = $model::findAll(['created_by'=> $id]); 
        return $this->render(
            'view',
            [
                'title' => $title,
                'dataProvider' => $dataProvider,
            ]
            );
        } else {
            throw new ForbiddenHttpException('Access denied for user '.Yii::$app->user->identity->id);
        }
   */
    }

どんな提案でも大歓迎です!

4

1 に答える 1