es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Agregue algunos registros a todos los resultados de la consulta elocuente.

Tengo una tabla llamada food_portion como la siguiente:

id|food_id|name|gram_weight


1|102030|rebanada|183

2|102030|tarta|183

3|102031|gofre|35

….

La tabla está completa, pero faltan algunas porciones globales como gramo/onzas…
Quería escribir una consulta para agregar registros para estas porciones, pero estoy pensando que no es una buena opción porque estas porciones tienen el mismo valor para todos los alimentos.

||gr|1 (6000 registros como este)

||oz|28 (y otros 6000 como este)

Entonces estoy buscando una forma de modificar mi modelo (food_portion) para que cada vez que ejecuto una consulta utilizando el modelo, obtenga los registros anteriores sin tenerlos físicamente en la tabla de la base de datos. De esta manera, mis consultas no serían lentas sin motivo.

¿Cómo puedo hacer esto? Intenté hacerlo utilizando el ámbito global pero fallé:

protected static function booted()
{
static::addGlobalScope(‘global_portions’, function (Builder $builder) {
$builder->orWhere(function ($query)
{
//$query->where(“food_id”,”*”)->where(“name”,”gr”) ???
// ¿Qué debo escribir aquí?
});
});
}

En resumen, quiero evitar la repetición de registros para cada alimento.
Quiero agregar dos registros específicos a cada resultado de consulta.

Gracias de antemano

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para lograr esto, puedes agregar los dos registros específicos como atributos virtuales a tu modelo FoodPortion. Los atributos virtuales son atributos que no existen en la tabla de la base de datos, pero son generados dinámicamente por la instancia del modelo.

    Aquí tienes un ejemplo de implementación:

    1. Agrega los atributos virtuales a tu modelo FoodPortion:
    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class FoodPortion extends Model
    {
        protected $appends = ['gr_portion', 'oz_portion'];
    
        public function getGrPortionAttribute()
        {
            return 'gr';
        }
    
        public function getOzPortionAttribute()
        {
            return 'oz';
        }
    
        // resto del código del modelo
    }
    

    La propiedad protected $appends debe contener los nombres de los atributos virtuales que deseas agregar. En este caso, gr_portion y oz_portion.

    Los métodos getGrPortionAttribute y getOzPortionAttribute son métodos de acceso que devuelven los valores de los atributos virtuales.

    1. Utiliza el modelo como de costumbre en tus consultas:
    <?php
    
    $foodPortions = FoodPortion::where('food_id', 102030)->get();
    
    foreach ($foodPortions as $foodPortion) {
        echo $foodPortion->name . ' (' . $foodPortion->gram_weight . ' gr) <br>';
        echo 'Porción en gramos: ' . $foodPortion->gr_portion . ' <br>';
        echo 'Porción en onzas: ' . $foodPortion->oz_portion . ' <br>';
    }
    

    Los atributos virtuales gr_portion y oz_portion se incluirán en los resultados de la consulta para cada instancia de FoodPortion.

    Nota: También puedes utilizar los métodos de acceso para modificar atributos existentes, por ejemplo, para convertir pesos de gramos a onzas.

Comments are closed.