Uso de consultas

hola comunidad estoy tratando de implementar el uso de query, para ello estudie la guia en el conastructor de consultas, pero hoy me da un error:

tengo dos tablas, datossal y entiades con estos campos necesarios:

  1. datossal:

Idn int llave principal

entidad_id varchar 12

  1. entidades:

CodUEB varchar 12 llsve principal (relacionada con datossal uno a muchos)

Cod int

aqui tengo varias entidades ejemplo:

CodUEB Cod

0161203 3

0161204 4

en el controlador estoy implementando una cadena en la accion create como sigue:


 public function actionCreate() {

        $model = new Datossal;

        // $sql = 'SELECT CodUEB, Cod, NEnt FROM entidades, datossal where entidades.CodUEB = datossal.entidad_id';

        // $ent = Entidades::findBySql($sql)->one();

   utlizo esta o la de arriba puesta con //    

 $ent = Entidades::find()->one();


        if ($model->load(Yii::$app->request->post()) && $model->save() && $model->validate()) {//

            $fecha = date("y");

            $cadena1 = $ent->Cod;

            $cadena3 = "_";

            $cadena4 = $model->Idn; /

            $cadena5 = "0";

            $cadena6 = "00";

            $cadena7 = "000";

            $cadena8 = "MN";

            //llenar numero de factura

               //  $criteria = new yii\db\ActiveQuery;

            $criteria = yii\db\ActiveRecord::find('Idn=:Idn');

            $criteria->params = array(':Idn' => $model->Idn);

            $objFact = Datossal::find($criteria)->asArray()->all();

            if ($model->Idn <= 9) {

                $model->nfactura = $fecha . $cadena8 . $cadena3 . $cadena7 . $cadena4;

            } elseif ($model->Idn >= 10 & $model->Idn <= 99) {

                $model->nfactura = $fecha . $cadena8 . $cadena3 . $cadena6 . $cadena4;

            } elseif ($model->Idn >= 100 & $model->Idn <= 999) {

                $model->nfactura = $fecha . $cadena1 . $cadena8 . $cadena3 . $cadena5 . $cadena4;

            } elseif ($model->Idn >= 1000) {

                $model->nfactura = $fecha . $cadena8 . $cadena3 . $cadena4;

            }

            $model->fecha_c = date('Y-m-d_h.i.s'); /

        

            $model->save();

         

            Yii::$app->getSession()->setFlash('success', 'Factura realizada satisfactoriamente.');

            return $this->redirect(['index', 'id' => $model->Idn]);

        } elseif (!Yii::$app->request->isPost) {

            $model->load(Yii::$app->request->get());

        }

        return $this->render('create', ['model' => $model]);

    }

el objetivo es que me llene el numero de factura automaticamente tomando los valores de la cadena, por ejemplo de esta forma: 184MN_0085, segun valores, pero el caso es que como esta la $cadena1, me toma como es logico el primer valor de la primera entidad que encuentra en la tabla entidades, si cambio one() por all(), entonces me da este error:


 PHP Notice – yii\base\ErrorException

Trying to get property 'Cod' of non-object

al leer aqui


 $cadena1 = $ent->Cod;

, realmente no se como implementar esta consulta, ya probe con varias formas de consultas segun la guia y con ninguna me resulta, necesito sus colaboraciones para resolver esto.

Hola Rafael,

He intentado separar un poco esa accion, tendra errores, pero para vas comentando y vemos que pasa.




//en modelo	--> es la relacion entre las tablas

	public function getDatosSal()

	{

		return $this->hasMany(Datossal::className(), ['entidad_id' => 'CodUEB']);

	}

	

	

	//en modelo

	 public function cargarNfactura($cod) {

		$fecha = date("y");

		$cadena1 = $cod;

		$cadena3 = "_";

		$cadena4 = $this->Idn; 

		$cadena5 = "0";

		$cadena6 = "00";

		$cadena7 = "000";

		$cadena8 = "MN";

		if ($this->Idn <= 9) {

			$this->nfactura = $fecha . $cadena8 . $cadena3 . $cadena7 . $cadena4;

		} elseif ($this->Idn >= 10 & $this->Idn <= 99) {

			$this->nfactura = $fecha . $cadena8 . $cadena3 . $cadena6 . $cadena4;

		} elseif ($this->Idn >= 100 & $this->Idn <= 999) {

			$this->nfactura = $fecha . $cadena1 . $cadena8 . $cadena3 . $cadena5 . $cadena4;

		} elseif ($this->Idn >= 1000) {

			$this->nfactura = $fecha . $cadena8 . $cadena3 . $cadena4;

		}

	 }

	 

	 //en controlador

	 public function actionCreate() {

	    $model = new Datossal;

		if ($model->load(Yii::$app->request->post()) && $model->validate()) {//

			// model->Idn debe venir de post ¿?

			$objFact = Datossal::find()->where(['Idn' => $model->Idn])->asArray()->all();

			//esto se recorre como un array foreach ($objFact as $oneObjFac)....

			

			$ent = Entidades::find()->joinWith('datosSal')	//la relacion debe crearse en el modelo

			->select('CodUEB, Cod, NEnt')->asArray()->one();	//yo creo que falta una condición, el where

						

			$model->cargarNfactura($ent->Cod);

			$model->save();

         

            Yii::$app->getSession()->setFlash('success', 'Factura realizada satisfactoriamente.');

            return $this->redirect(['index', 'id' => $model->Idn]);//ir al index con Idn ??

		} elseif (!Yii::$app->request->isPost) {

            $model->load(Yii::$app->request->get());

        }

        return $this->render('create', ['model' => $model]);		 

	 }



saludos

Ok gracias rahif por responder, voya a analizar esta via, realmente se ve funcional con metodos del framework que es el primer objetivo el uso del mismo, de todas formas ya habia resuelto con otro via menos funcional, ya que mi objetivo era formar el numero de factura y en ese caso especifico colocar un caracter (numero) que fuese el final del codigo de la entidad usada para cualquier nuero de identidad ejemplo: 016104 o 01611254253213, o sea para cualquier cantidad de digitos que tuviera, lo hice asi con php:


 $e = $model->entidad_id;

        $n = 0;

        do {

            $e = floor($e / 10);

            $n = $n + 1;

        } while ($e > 0);

tomo el codigo de la identidad que le estoy pasando a la vista, cuento la cantidad de dijitos que tiene y al final tomo el ultimo dijit con esto


$cadena1 = substr($cadena, -$n);

de todas formas voy a utilizar esta via ya que como te dije se ve mas funcional al framework, gracias cualquier cosa de digo

Lo del último digito de una cadena no se si he entendido bien pero es:




$cadena = '1234567890';

$ultimoDigito = substr($cadena, -1);



suerte con el proyecto