Inner join mysql y yii 2.

Hola chicos este es mi metodo del controlador y funcionaba con una sola tabla pero con dos no.

Que es lo que esta conceptualmente mal?




 public function actionAbout()

    {

        $table= new t_complejos;

        $model = $table->find()->all();

        $model2 = $table2->find()->all();

        $table2 = new t_canchas;

        $form= new formBusqueda;

        $search = null;

        

        if($form->load(Yii::$app->request->get()))

        {

            if ($form->validate())

            {

             $search = Html::encode($form->q);

                $query = "SELECT * FROM t_complejos inner join t_canchas on t_complejos.id_complejos = t_canchas.id_cancha '%$search%' OR ";

                $model = $table->findBySql($query)->all();

                $model2 = $table2->findBySql($query)->all();

            }

            else

            {


                $form->getErrors();

            }


        }

        return $this->render("about", ["model"=>$model, "form"=>$form, "search"=>$search]);

    }















Buenas.

No sé ni por donde empezar!!!!!

En el momento que cargas el modelo de complejos ya tienes todas sus canchas!!!!!!! Claro está si tienes bien definidos tus modelos.

Además, estás usando la variable $table2 antes de crearla?!?!?!

Este código no te puede funcionar ni con una sola tabla!

Si haces esto:




$complejos = t_complejos::findAll();



ya tienes todos los complejos con sus canchas relacionadas.




foreach($complejos as $complejo)

{

     echo($complejo->FK_Cancha->nombreCancha);// FK_Cancha sería el nombre de la relación que en tu modelo complejos

                                              // tienes con canchas 8obviamente tú tendrás un nombre distinto), y nombreCancha

                                              // sería el nombre de la cancha (que tú igual ni tienes, tendrás que cambiarlo por

                                              // atributo de canchas que desees recuperar).

}



Revisa algún manual de patrones MVC, que es lo que te falta.

Un saludo.

No entiendo nombreCanchas que iria ahi?

mira si tengo relacionado mediante foreign keys en sql las tablas las relaciones hasmany y hasone se indician obligadamente en el modelo?

Yo me confundo si o si debo usar innerjoinwhit para indicar la tabla si hago findOne::tabla solo trae lo de esa tabla no?

Como que qué va ahí? pero si te lo explico en el comentario…

Yo supongo que tienes un atributo llamado nombreCacha, pero tendrías q cambiarlo por el atributo del modelo que quieras recuperar.

Y findOne es un método de CActiveRecord. Si te lees la API de CActiveRecord verás que findOne recupera un modelo de la tabla que tu quieras.

Y dirás: "Lo que yo decía, de una tabla".

Y yo diré: "Sí, efectivamente, pero es q los modelos CActiveRecord están construidos sobre una tabla, pero cada uno tiene también las relaciones con las demás tablas."

Mira, como ya te explicamos en este post y en otros muchos, lee algo sobre patrones MVC y la API de Yii para saber que es cada cosa. No tiene sentido que utilices un CActiveRecord si no sabes lo que es.

Respondiendo a tu último mensaje:

  • findOne te recupera un modelo de datos de la tabla relacionada. Ese modelo tendrá una serie de propiedades entre las que se encuentran las relaciones con las demás tablas, mediante las cuáles podrás acceder a las propiedades relacionadas con el modelo cargado.

Un ejemplo en Yii2:

Tus modelos:




class Customer extends ActiveRecord

{

    public function getOrders()

    {

        return $this->hasMany(Order::className(), ['customer_id' => 'id']);

    }

}


class Order extends ActiveRecord

{

    public function getCustomer()

    {

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

    }

}



Por ejemplo en tu controlador:




// SELECT * FROM `customer` WHERE `id` = 123

$customer = Customer::findOne(123);


// SELECT * FROM `order` WHERE `customer_id` = 123

// $orders is an array of Order objects

$orders = $customer->orders;// orders apunta al método getOrders del modelo Customers.



Un saludo.