> Faqs > Incluir solamente unos campos de los modelos relacionados con Laravel Eloquent

Incluir solamente unos campos de los modelos relacionados con Laravel Eloquent

En las consultas Laravel Eloquent habitualmente hago un "with", lo que me permite traer de una vez los modelos relacionados, con carga adelantada (eager loading).

El asunto que quiero optimizar ahora es traer solamente algunos de los campos de los modelos relacionados, en vez de todas las columnas. Se trata de una tabla que tiene mucha información, pero yo únicamente necesito traerme el título.

He visto en la documentación de Laravel que tengo la posibilidad de especificar los campos, con esta sintaxis.

$featuredProducts = ProductTag::whereTagId($tag->id)->whereFeatured(true)->with('product:title')->get();

El problema es que no me está trayendo el título, ni tan siquiera el registro completo, sólo me trae null. La relación está bien realizada, está comprobado. Si hago esto:

$featuredProducts = ProductTag::whereTagId($tag->id)->whereFeatured(true)->with('product')->get();

Me devuelve la relación correctamente en la consulta, pero Eloquent me entrega todos los datos del producto y yo solo quiero el título. ¿qué puede ser lo que esté fallando? ¿Es posible optimizar la consulta de otra manera?

Respuestas

La sintaxis que estás usando para decir qué campos específicos del modelo relacionado quieres recibir es correcta. Solamente te falla un detalle.

En el método with() indicas ":" seguido de los campos que quieres traer, separados por comas. "product:id,title".

La clave en este caso es que, al enumerar los campos que deseas traerte, Laravel Eloquent te obliga a indicar que al menos necesitas el campo ID. Si no colocas el id entre los campos que quieres obtener, simplemente la relación te devuelve un null en el modelo/s relacionado/s.

Un ejemplo de la sintaxis quedaría así:

$products = Product::with('brand:id,name')->get();
Miguel Angel
3295 146 215 17