mostrar datos de otras tablas en gridview

Soy nuevo en yii, y estoy utilizando un gridview para mostrar los datos, todo va bien hasta que uso las sentencias join, mi codigo es el siguiente


   public function search($params)

    {

        $query= new \yii\db\Query();

        $query->select(['negocio.nombre','negocio.sitioweb','usuario.nombre'])->from('negocio')->join('INNER JOIN','usuario','negocio.usuario_id=usuario.id');

        //($query= Negocio::findBySql('SELECT (negocio.nombre),(usuario.nombre) FROM negocio INNER JOIN usuario  On negocio.usuario_id=usuario.id');

        // add conditions that should always apply here

        //Hacer con un dataprovider!!!

        $dataProvider = new ActiveDataProvider([

            'query' => $query,

        ]);


        $this->load($params);


        if (!$this->validate()) {

            // uncomment the following line if you do not want to return any records when validation fails

            // $query->where('0=1');

            return $dataProvider;

        }


        // grid filtering conditions

        $query->andFilterWhere([

            'id' => $this->id,

            'usuario_id' => $this->usuario_id,

            'updated_at' => $this->updated_at,

            'provincia_id' => $this->provincia_id,

            'categoria_id' => $this->categoria_id,

            'factura_id' => $this->factura_id,

        ]);


        $query->andFilterWhere(['like', 'nombre', $this->nombre])

            ->andFilterWhere(['like', 'sitioweb', $this->sitioweb])

            ->andFilterWhere(['like', 'created_at', $this->created_at])

            ->andFilterWhere(['like', 'actividad', $this->actividad])

            ->andFilterWhere(['like', 'logo', $this->logo])

            ->andFilterWhere(['like', 'email', $this->email])

            ->andFilterWhere(['like', 'ciudad', $this->ciudad])

            ->andFilterWhere(['like', 'telefono', $this->telefono])

            ->andFilterWhere(['like', 'latitud', $this->latitud])

            ->andFilterWhere(['like', 'longitud', $this->longitud])

            ->andFilterWhere(['like', 'palclaves', $this->palclaves])

            ->andFilterWhere(['like', 'direccion', $this->direccion])

            ->andFilterWhere(['like', 'numloupper', $this->numloupper])

            ->andFilterWhere(['like', 'portada', $this->portada])

            ->andFilterWhere(['like', 'archivologo', $this->archivologo]);


        return $dataProvider;

    }

el problema es que, realicé el crud con gii, y el gridview solo me trae los datos del modelo y la tabla especificada, que es "Negocio", cuando agrego una columna al gridview especificando los datos de la otra tabla, algo como "usuario.nombre", no me lo reconoce, a demas de que los encabezados pierden la funcionalidad de ordenarse tanto ascendente como descendente mente,¿como podria realizar esta consulta en el grid, y luego que se pueda ver en el detalview?

Hola bienvenido al foro.

La idea es hacer las querys complejas, las simples debe de hacerlas el framework.

En tu caso para que la clase negocio se relacione con usuario hay que crear una relacion (una funcion).

Pon esto en la clase negocio:




    public function getUsuario() {

        return $this->hasOne(Usuario::className(), ['id' => 'id_usuario']);

    } 



Con esto la clase negocio ya sabe encontar los datos del usuario a traves de esta funcion.

Ahora para hacer la query en el search:




public function search($params)

{

        $query= new \yii\db\Query();

        $query->join(['usuario']);      //lazy load

        //$query->joinWith(['usuario']);  //eager load


        $this->load($params);


        if ($this->validate()) {

            //aqui los filtros pon los que necesites

            //cuidado aqui tienes que desambiguar los campos

        }

        return $dataProvider;

}



con esto deberian mostrarse los datos en el gridview con usuario.nombre, …

hay una diferencia entre join y joinWith miralo con el debugger.(el nº de querys que se realizan)

saludos

Hola rahif, gracias por responderme :) , he aplicado lo que me dijiste y logre solucionar el problema, hay otra incognita que tengo he querido utilizar el crud para crear datos y me da un error, es este error en especifico

"Call to a member function getActiveValidators() on null"

lo que intento hacer es que al tener dos campos relacionados,(categoria y sub categoria), cuando el usuario desea crear una sub categoria debe elegir la categoria padre, para la modificacion solo traje los datos llenado el formulario ‘_form’ a la hora de modificar no me da ningun problema, pero cuando deseo crear me deja el error, este es mi codigo


<div class="subcategoria-form">


    <?php $form = ActiveForm::begin(); ?>

    <!--este es el codigo de la tabla categoria, subcategoria-> categoria-> nombre-->

    <?= $form->field($model->categoria, 'nombre')->textInput(['maxlength' => true]) ?>

<!--codigo de la subcategoria,subcategoria->nombre-->

    <?= $form->field($model, 'nombre')->textInput(['maxlength' => true]) ?>




   <!-- <?= $form->field($model, 'categoria_id')->textInput() ?>


    <?= $form->field($model, 'nivel')->textInput() ?>


    <?= $form->field($model, 'padre_id')->textInput() ?>


    <?= $form->field($model, 'updated_at')->textInput() ?>


    <?= $form->field($model, 'created_at')->textInput(['maxlength' => true]) ?>-->


    <div class="form-group">

        <?= Html::submitButton($model->isNewRecord ? Yii::t('app', 'Crear') : Yii::t('app', 'Modificar'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>

    </div>

Por lo que veo parece un error de validación pero no entiendo muy bien el porque, he intentado pasarle el objeto en el controlador a la vista create, pero aun asi el problema persiste, que crees que pueda ser?