<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Johan Tovar</title>
    <description>The latest articles on DEV Community by Johan Tovar (@johantovar).</description>
    <link>https://dev.to/johantovar</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F612497%2Fe5811df6-2ca4-400c-9c37-3ffe13467ba5.jpeg</url>
      <title>DEV Community: Johan Tovar</title>
      <link>https://dev.to/johantovar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/johantovar"/>
    <language>en</language>
    <item>
      <title>Aprende eloquent con ejemplos!!! Lección 7 - Create y Update</title>
      <dc:creator>Johan Tovar</dc:creator>
      <pubDate>Sun, 27 Jun 2021 16:59:53 +0000</pubDate>
      <link>https://dev.to/johantovar/aprende-eloquent-con-ejemplos-leccion-7-create-y-update-160n</link>
      <guid>https://dev.to/johantovar/aprende-eloquent-con-ejemplos-leccion-7-create-y-update-160n</guid>
      <description>&lt;p&gt;Bienvenidos a una nueva entrega de Eloquent con ejemplos. Hasta ahora hemos aprendido sobre diversas funciones y herramientas que este genial ORM nos ofrece, sin embargo, no hemos visto como usarlo para persistir nuestros datos.&lt;/p&gt;

&lt;p&gt;Al principio de la serie, vimos las diferencias entre hacer un &lt;code&gt;insert()&lt;/code&gt; y un &lt;code&gt;create()&lt;/code&gt;, como recordaremos, el primero ejecuta una instrucción sql que coloca los datos directamente dentro de nuestra tabla, mientras que el segundo crea una instancia de un modelo eloquent, lo que nos resulta bastante útil al momento de querer seguir usando esta información para ejecutar alguna otra lógica dentro de nuestra aplicación.&lt;/p&gt;

&lt;p&gt;Cosas que aprenderemos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create y Update&lt;/li&gt;
&lt;li&gt;Atributos fillable y guard&lt;/li&gt;
&lt;li&gt;findOrNew&lt;/li&gt;
&lt;li&gt;firstOrNew/firstOrCreate&lt;/li&gt;
&lt;li&gt;updateOrCreate&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Create y Update
&lt;/h2&gt;

&lt;p&gt;En lecciones anteriores aprendimos como usar el QueryBuilder para insertar un nuevo registro en la base de datos, a través del uso de la facade &lt;code&gt;DB&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'dogs'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Old Yeller'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'age'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;  &lt;span class="c1"&gt;// result "true"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como bien lo mencionamos más arriba, esto no hace más que ejecutar una instrucción sql para persistir los datos que le enviamos en la tabla correspondiente, recibiendo una respuesta booleana que nos indica si su ejecución fue exitoso o no, y eso es todo, esta instrucción no agregará marcas de tiempo ni hará alguna otra cosa por nosotros, si necesitáramos seguir trabajando con esta data que enviamos, pues habría que ejecutar una consulta y traer el registro, o trabajar con la información en crudo tal cual la enviamos. Probemos ahora con Eloquent a ver que tal nos va y si nos puede ayudar con esta tarea:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$dog&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// result "App\Models\Dog"&lt;/span&gt;
&lt;span class="nv"&gt;$dog&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Just-right Yeller'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// result "Just-right Yeller"&lt;/span&gt;
&lt;span class="nv"&gt;$dog&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// result 6&lt;/span&gt;
&lt;span class="nv"&gt;$dog&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;    &lt;span class="c1"&gt;// result "true"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este ejemplo, estamos haciendo uso del método &lt;code&gt;save()&lt;/code&gt; que proporciona eloquent, para ello, debemos asignar los valores a cada propiedad de nuestro modelo y ejecutar el método, esto actuará de la misma manera que el &lt;code&gt;insert&lt;/code&gt; de arriba, persistiendo nuestros datos, pero con el plus de tener una instancia de nuestro modelo, lo que nos permitirá trabajar con este registro de una manera más cómoda, pudiendo hacer casi cualquier cosa con ella.  Sin embargo, podemos ver que acá trabajamos con una especie de enfoque híbrido, hemos creado una instancia del modelo, luego establecimos los atributos, para finalmente guardarlo, a grandes rasgos podríamos decir que fueron tres pasos ejecutados, veamos una tercera forma de guardar nuestra información con menos instrucciones:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Dog&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Young Yeller'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'age'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nos ha reventado en la cara esta &lt;code&gt;exception&lt;/code&gt;: &lt;em&gt;"Illuminate\Database\Eloquent\MassAssignmentException con el mensaje 'name'"&lt;/em&gt; - ¿MassAssignmentException, de qué se trata?&lt;/p&gt;

&lt;p&gt;Pues bien, aquí es donde nuestros amigos &lt;code&gt;$fillable&lt;/code&gt; y &lt;code&gt;$guard&lt;/code&gt; entran al juego.  Eloquent, en su grandiosa misión de facilitarnos el manejo de información desde y hacia la base de datos, no solo nos proporciona métodos y propiedades para este particular, además, no brinda apoyo en cuanto a la protección en la ejecución de estas tareas, al garantizar que solo se inserten o actualicen los campos  que se desean rellenar y nada más, para ello, en primer lugar tenemos a la propiedad &lt;code&gt;$fillable&lt;/code&gt;, la cual es una especie de lista blanca, en la cual le indicamos cuales son los campos de nuestra base de datos que puede guardar a través de la asignación en masa. En segundo lugar, tenemos &lt;code&gt;$guard&lt;/code&gt; la cual es todo lo contrario, en ella indicamos aquellos que deseamos proteger y que solo podrán ser asignados de manera directa (como en el segundo ejemplo usando save()).&lt;/p&gt;

&lt;p&gt;Solucionemos esto y pongámoslo en marcha. Vayamos al modelo Dog y agreguemos la siguiente línea:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nv"&gt;$fillable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora desde tinker creemos un nuevo registro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Dog&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Young Yeller'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'age'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con esta instrucción hemos hecho lo mismo que en el ejemplo anterior, salvo una excepción, hemos cometido un error y no nos hemos dado cuenta. Si revisamos nuestra base de datos, encontraremos que efectivamente nuestro amigo &lt;em&gt;Young Yeller&lt;/em&gt; se encuentra registrado, sin embargo, a pesar que hemos indicado su edad al momento del registro, este dato no ha persistido, ¿y por qué?, pues tan simple como que no le indicamos a &lt;code&gt;$fillable&lt;/code&gt; que podía permitir la asignación de este campo. Este es un error muy común y de los que muchas veces tardamos en darnos cuenta debido a que en realidad no existe ninguna señal de error que así no los indique, por lo que podríamos pasar horas quebrándonos la cabeza buscando el motivo por el cual nuestros datos no persisten, muchos podrán pensar que esto es una desventaja e incluso algunos tratarían de evitar el uso de este método, sin embargo, debemos tomar en cuenta que esto es así por una razón, la ‘inyección de SQL’, de esta manera, aunque cualquier atacante intente y logre agregar campos no definidos por nosotros, estos no afectarán a nuestra aplicación puesto que serán ignorados por Eloquent.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;La inyección de sql es un tipo de ataque muy común en la web, si quieres saber un poco más sobre ello, puedes hacerlo en el link: &lt;a href="https://www.avast.com/es-es/c-sql-injection"&gt;Inyección de SQL&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ahora bien, aunque hasta ahora hemos visto tres diferentes maneras de como guardar nuestros datos, aún quedan algunos otros métodos que nos ayudan en esta misma tarea, y si bien puede parecer abrumador tener que aprender tantas opciones y manera de hacer una cosa, la verdad es que cada una tiene una finalidad o ayudan de una manera distinta, solventando tipos de situaciones diferentes.&lt;br&gt;
Vemos entonces una nueva forma de hacer lo anterior:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$dog&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt; &lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Young Yeller'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'age'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// result App\Models\Dog {#690 name: "Young Yell&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como vemos, la instrucción anterior no hace más que crear una instancia del modelo Dog, mas no persiste ni crea ningún registro, si queremos que esto suceda debemos invocar al método &lt;code&gt;save()&lt;/code&gt; desde nuestra instancia.&lt;/p&gt;

&lt;h2&gt;
  
  
  findOrNew, firstOrNew/firstOrCreate:
&lt;/h2&gt;

&lt;p&gt;Estas tres funciones son increíblemente útiles, sin embargo, muchos desarrolladores de Laravel rehúyen de ellas como algo desconocido. No hay necesidad de hacerlo; de hecho, a estas alturas ya deberíamos tener algún entendimiento de lo que hacen.&lt;/p&gt;

&lt;p&gt;En los ejemplos anteriores hemos visto como al hacer uso de &lt;code&gt;new&lt;/code&gt; solo creamos una instancia del modelo, nada distinto a una simple creación de instancia desde php puro &lt;code&gt;$dog = new Dog($data)&lt;/code&gt;. Por su parte, &lt;code&gt;Create&lt;/code&gt; también crea una instancia del modelo con la distinción de que además persiste en la base de datos la información contenida en la instancia, o lo que se podría traducir en &lt;code&gt;$dog= (new Dog($data))-&amp;gt;save()&lt;/code&gt;, en este sentido, podemos decir que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;findOrNew&lt;/strong&gt; lo que hace es “Buscar un registro con la clave principal, si la encuentra la devuelve y si no crea una instancia nueva y vacía del modelo.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$dog&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;findOrNew&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;App\Models\Dog&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#4061}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;firstOrNew&lt;/strong&gt; lo que hace es “ Buscar el primer registro que cumpla con la condición. Si no puede encontrar uno, crea una nueva instancia de modelo poblada con la información dada sin persistirla"
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Si existe lo devuelve&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$dog&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;firstOrNew&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Jock'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;App\Models\Dog&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#4284&lt;/span&gt;
     &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Jock"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;gender&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"male"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2021-06-07 02:05:46"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;updated_at&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2021-06-07 02:05:46"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;deleted_at&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Si no existe crea la instancia&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$dog&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;firstOrNew&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Champ'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;App\Models\Dog&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#3333&lt;/span&gt;
     &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Champ"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;firstOrCreate&lt;/strong&gt; lo que hace es “ Buscar el primer registro que cumpla con la condición. Si no puede encontrar uno, crea una nueva instancia de modelo poblada con la información dada y la guarda en la base de datos"
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$dog&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;firstOrCreate&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Champ'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;App\Models\Dog&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#4282&lt;/span&gt;
     &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Champ"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;updated_at&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2021-06-27 15:26:41"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2021-06-27 15:26:41"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;App\Models\Dog&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#4287&lt;/span&gt;
     &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Champ"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;gender&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2021-06-27 15:26:41"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;updated_at&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2021-06-27 15:26:41"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;deleted_at&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ya los vamos entiendo, sin embargo, quizás surja la duda de ¿Por qué querríamos hacer instancias vacías? Hay algunas razones, pero una es que cuando buscamos un registro, siempre tendremos una instancia de modelo como clase de resultado, incluso si no se encuentra la que queremos, esto significa que podemos escribir nuestro código de forma más coherente y limpia, porque no tenemos que ensuciarlo con muchos condicionales por todas partes.&lt;/p&gt;

&lt;h2&gt;
  
  
  updateOrCreate:
&lt;/h2&gt;

&lt;p&gt;Antes de terminar por hoy, veamos una última función a tener en cuenta &lt;code&gt;updateOrCreate()&lt;/code&gt;. Esta función nos permite concluir una búsqueda de varias partes con una instrucción de inserción o de actualización dependiendo de su resultado. Por ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Dog&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;updateOrCreate&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Joe'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'age'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En ese caso, al igual que los anteriores, buscará un perro cuyo id se igual a &lt;em&gt;1&lt;/em&gt; y su nombre sea &lt;em&gt;Joe&lt;/em&gt;, ambas condiciones son incluyente, al encontrar una coincidencia, cambiará su edad al valor de &lt;em&gt;15&lt;/em&gt;, por otro lado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Dog&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;updateOrCreate&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Joe'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'age'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Al no existir ninguna coincidencia que satisfaga las condiciones, esta función procederá a crear un nuevo registro con la información dada, asignando el nombre &lt;em&gt;Joe&lt;/em&gt; y la edad de &lt;em&gt;15&lt;/em&gt; al id correspondiente al nuevo registro. Como vemos, esto es útil para cosas como un perfil de usuario, donde es posible que no deseemos pedirle al usuario que complete una gran cantidad de información cuando se registre, pero si mostrarle una pantalla de perfil donde pueda terminar de actualizar más tarde.&lt;/p&gt;

&lt;p&gt;Hoy hemos visto un montón de técnicas distintas, pero a la vez muy fácil de entender e implementar, además de tener un montón de ventajas como Eloquent ya nos tiene acostumbrados, sin embargo, es importante que nos tomemos el tiempo para experimentar con cada una de ellas; ver que funciona como esperamos y lo que no, y por supuesto, tratar de hacer cualquier variación que se nos ocurra. Hay muchos más trucos que podemos usar con lo aprendido hoy, solo debemos profundizar más en nuestro aprendizaje, echarle un ojo a la documentación oficial y al mismo código de Laravel y ser creativos.&lt;/p&gt;

&lt;p&gt;Es todo por el día de hoy, quédate atento a la próxima entrega, si tienes alguna duda puedes contactarme en mi cuenta de twitter &lt;a href="https://twitter.com/JohanTovar"&gt;@johantovar&lt;/a&gt; o déjala en los comentarios. Hasta entonces y que tengas un feliz y exitoso día.&lt;/p&gt;

&lt;p&gt;Repositorio de práctica: &lt;a href="https://github.com/jtovarto/serie-eloquent-con-ejemplo"&gt;jtovarto/serie-eloquent-con-ejemplo&lt;/a&gt;&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>webdev</category>
      <category>eloquent</category>
    </item>
    <item>
      <title>Aprende eloquent con ejemplos!!! Lección 6 - Accesors, Mutators y Casts</title>
      <dc:creator>Johan Tovar</dc:creator>
      <pubDate>Mon, 07 Jun 2021 01:52:28 +0000</pubDate>
      <link>https://dev.to/johantovar/aprende-eloquent-con-ejemplos-leccion-6-accesors-mutators-y-casts-3ma9</link>
      <guid>https://dev.to/johantovar/aprende-eloquent-con-ejemplos-leccion-6-accesors-mutators-y-casts-3ma9</guid>
      <description>&lt;p&gt;¡Bienvenido a la lección seis de Eloquent con ejemplos!&lt;/p&gt;

&lt;p&gt;Muchas veces dentro de la construcción de nuestras aplicaciones, nos encontraremos con que queremos (o debemos) mostrar cierto tipo de información en un formato determinado, y aunque muchas veces esto lo solucionaremos con el uso de un poco de CSS, código javascript o incluso “helpers” de Laravel o del propio PHP, no nos serán ajenas aquellas situaciones en donde dichos formatos requieran de cierta lógica más compleja, lo que quizás nos obligue a llenar nuestras vistas de código para cumplir con esta tarea.&lt;br&gt;
En este sentido, si nos decantamos por depositar esta lógica dentro de las vistas, estaremos incurriendo en lo que se considera una mala práctica, rompiendo con una cantidad importantes de principios y estándares propio del paradigma MVC y de la programación en general, eso sin mencionar lo confusas y sucias que se verán, llevándonos a un escenario lleno de inconvenientes de cara a la escalabilidad, reusabilidad, mantenimiento y posiblemente hasta de seguridad, sin embargo, en la lección de hoy abordaremos un poco sobre algunas herramientas y trucos que nos ofrece eloquent para encargarnos de este tipo de situaciones, no solo eliminando los inconvenientes, sino que además nos aporta una gran variedad de ventajas adicionales.&lt;/p&gt;

&lt;p&gt;Cosas que aprenderemos:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;•  Accesors
•  Mutators
•  Casts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Accesors:
&lt;/h2&gt;

&lt;p&gt;Como hemos visto en las entregas pasadas, para acceder a cualquier campo de nuestra base de datos lo hacemos de una manera muy sencilla, solo haciendo un llamado a la propiedad correspondiente dentro de nuestro modelo, sin embargo, muchas veces, aunque este dato esta correctamente guardado, necesitamos mostrar un formato distinto al que ya tiene, es aquí donde los accesors entran en acción y nos salvan el día. Mediante el uso de accesors podremos manipular un registro de datos mientras sigue formando parte del modelo, cambiándolo de la forma que deseemos, vamos a verlo mediante un ejemplo:&lt;/p&gt;

&lt;p&gt;Todos los nombres de nuestros perros se encuentran registrados en letra capital, así que cambiemos eso y hagamos que siempre se muestren en mayúsculas, para ello, coloquemos el siguiente código dentro de nuestro modelo &lt;code&gt;Dog&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getNameAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;strtoupper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A simple vista, parece que solo hemos agregado un método como cualquier otro, pero en cierta forma esto tiene su magia. En primer lugar, tenemos la palabra ‘get’ que indica que queremos obtener el valor, seguido del nombre del atributo (en nuestro caso ‘name’), el cual puede variar según nuestras necesidades, finalizando entonces con la palabra ‘attribute’, todo perfectamente construido bajo una notación ‘camelCase’. Lo anterior es una convención ya establecida y debemos seguirla siempre para que todo funcione.&lt;br&gt;
Ahora bien, pasemos a tinker y consultemos un registro cualquiera de nuestra tabla ‘dogs’, en el siguiente ejemplo hemos elegido a nuestro amigo ”Jock”, obteniendo como respuesta “JOCK”:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;
&lt;span class="mf"&gt;...&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"JOCK"&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;¡Listo! así de fácil hemos modificado nuestro registro, sin usar más que un simple método y siguiendo la convención establecida para ello. No importa en que forma este guardado el nombre de nuestros amigos caninos en la base de datos, a partir de ahora, siempre se mostraran en mayúsculas donde sea que lo necesitemos, pero, algo muy importante a tener en cuenta es la palabra siempre, porque a pesar que nuestro nombre seguirá guardado en su formato original, la respuesta que obtendremos sera la modificada y esto es muy importante a la hora de necesitar trabajar con el formato original, así que debemos estar muy pendientes con eso.&lt;/p&gt;

&lt;p&gt;Ahora bien, si bien es fácil crear y manejar un accesors, no podemos obviar que el ejemplo anterior es sumamente sencillo, con simple CSS podríamos obtener el mismo resultado, sin embargo, es evidente el mundo de posibilidades que se nos abren al usar accesors, siendo métodos en los que podemos depositar cualquier lógica y retornar un formato totalmente elaborado, incluso podríamos agregar atributos a nuestros modelos construidos a partir de la información guardada en la base de datos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;//En el modelo Dog agreguemos&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getIdWithNameAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;//En tinker&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;idWithName&lt;/span&gt;
&lt;span class="mf"&gt;...&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"2 : JOCK"&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Así de fácil hemos agregado un atributo al modelo &lt;code&gt;Dog&lt;/code&gt; sin que éste exista en la base de datos, algo muy útil cuando queremos crear atributos dinámicos, ayudándonos a ahorrar espacio en la base de datos y ganando reusabilidad.&lt;/p&gt;

&lt;p&gt;Ahora que tenemos claro cómo usar nuestros accesors y las ventajas que nos brinda, trabajemos en un ejemplo diferente. Digamos que el cliente ha decido abrir una pequeña tienda y nuestro jefe nos ha encomendado el desarrollo de dicha característica. Para fines prácticos de esta lección, solo abordaremos los productos, dejando quizás las demás partes de esta tarea para futuras entregas.&lt;/p&gt;

&lt;p&gt;Pongamos manos a la obra entonces.&lt;/p&gt;

&lt;p&gt;Nuestra tienda, entre otras cosas debe contar con una tabla productos, la cual manejará por ahora solo unos pocos campos: id, name, slug, price y options. Ahora bien, definida nuestra entidad productos, debemos pasar a la creación de los archivos respectivos para el correcto funcionamiento, a estas alturas ya deberíamos saber cuáles son estos archivos y como crearlos: modelo, factory y seeder, ¿Lo tienes? ... estoy seguro que sí, pero si no es el caso, la invitación está abierta para revisar las entregas anteriores donde esta explicado detalladamente el paso a paso que debemos seguir.&lt;/p&gt;

&lt;p&gt;Pues bien, con el objeto de estandarizar un poco la construcción de nuestros datos, haremos solamente el seeder y el migrations correspondiente a los productos, quedando el resto como ejercicio y práctica de cada quien. Nuestros archivos deberían verse algo como esto:&lt;/p&gt;

&lt;p&gt;Migration&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;up&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'products'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Blueprint&lt;/span&gt; &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'slug'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'price'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'options'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'active'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;timestamps&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Modelo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;//Product.php&lt;/span&gt;
&lt;span class="c1"&gt;//Agregar propiedades fillables&lt;/span&gt;

&lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nv"&gt;$fillable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'price'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'active'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'options'&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Factory&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;//ProductFactory&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="s1"&gt;'name'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Collares'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'price'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="s1"&gt;'slug'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$attr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Str&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$attr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s1"&gt;'options'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;json_encode&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
            &lt;span class="s1"&gt;'color'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;faker&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;randomElement&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
                &lt;span class="s1"&gt;'rojo'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'azul'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'verde'&lt;/span&gt;
            &lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Seeder&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;//ProductSeeder.php&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="s1"&gt;'name'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Collares'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'price'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;1400.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'slug'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$attr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Str&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$attr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s1"&gt;'options'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;json_encode&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'color'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'azul'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Solo estamos sembrando un solo registro en nuestra base de datos, podríamos tener tantos como quisiéramos, pero para los fines del ejemplo es más que suficiente. Vayamos a tinker y consultemos nuestro producto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;App\Models\Product&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#4123&lt;/span&gt;
     &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Collares"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;slug&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"collares"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"1400.50"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"{"&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="s2"&gt;": "&lt;/span&gt;&lt;span class="n"&gt;azul&lt;/span&gt;&lt;span class="s2"&gt;"}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2021-06-06 16:58:45"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;updated_at&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2021-06-06 16:58:45"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A simple vista todos los campos están correctos, sin embargo, para poder mostrar correctamente la información como los usuarios la esperan, debemos hacer unas pequeñas modificaciones, empecemos entonces por el campo precios. En todo sistema informático encontraremos que el formato de separación de decimales es con notación de puntos, esto está bien y es perfecto para nuestra aplicación al momento de realizar sus cálculos, pero para nuestros clientes, quienes están acostumbrados a ver una coma (,) cumpliendo con esta función y al punto (.) como separador de millares, quizás pueda ser objeto de confusión, vamos a darle entonces un formato más familiar:&lt;/p&gt;

&lt;p&gt;En nuestro modelo &lt;code&gt;Product&lt;/code&gt; coloquemos el siguiente accesor&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getFormattedPriceAttribute&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;number_format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;convertedPrice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;','&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'.'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si consultamos en tinker, veremos ahora el nuevo formato.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"1400.50"&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;formattedPrice&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"1.400,50"&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora le hemos dado un formato mucho más legible a nuestros precios, sin modificar el valor original del mismo, sin embargo sigue siendo un ejemplo muy fácil aunque demostrativo del poder de eloquent, pero, si imaginamos por un momento un ecommerce internacional con manejo de precios en varias divisas, debiendo mostrarlos según las preferencias del usuario o por la región en donde se encuentra, esto nos llevaría a la implementación de una lógica que se encargue de hacer la conversión necesaria antes de mostrar los precios, sin duda un escenario en el que los accesors pueden ayudarnos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getFormattedPriceAttribute&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;number_format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;convertedPrice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;','&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'.'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getConvertedPriceAttribute&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;convertPrice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getConvertPrice&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;//lógica para determinar preferencias&lt;/span&gt;
    &lt;span class="nv"&gt;$rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;//conversión de precio&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;$rate&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hemos modificado nuestro primer accesor y ahora no trabaja con el campo &lt;code&gt;price&lt;/code&gt; directamente, sino que se vale del resultado de un nuevo accesor, para así retornar nuestro precio convertido y formateado al mismo tiempo. Tomemos en cuenta que es una implementación simple y con fines ilustrativos, son obvias las mejoras necesarias, pero queda de parte de cada uno de nosotros completar dicha tarea.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mutators:
&lt;/h2&gt;

&lt;p&gt;Los mutators son la otra cara de los accesors. Como ya vimos, con estos últimos podemos tomar los valores de la base de datos y mostrarlos de una manera distinta a su forma original, ahora con los mutators, es exactamente lo contrario, podremos capturar el valor antes de que entre en la base de datos y modificarlos antes de que sean persistidos, pudiendo hacer cosas como cifrar contraseñas, limpiar los datos, entre muchas otras tareas. Veamos un ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;setNameAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;strtoupper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos ver la similitud en la construcción entre ambas herramientas, a penas y se nota la diferencia entre la antes usada palabra “get” (accesors) y “set”, propia de los mutators, es debido esta pequeña diferencia en la construcción del nombre de ambos métodos que la gente a veces se confunde, pero con práctica no se debería tener ningún problema.&lt;/p&gt;

&lt;p&gt;Al igual que los accesors, podemos crear propiedades nuevas que no estén relacionadas con campos existente en nuestra base de datos, sin embargo, aunque no generará ningún error al momento de guardar nuestro modelo, los valores de estas propiedades no serán persistido.&lt;/p&gt;

&lt;p&gt;Las ventajas de usar los mutators recae sobre varios tópicos, entre los cuales podemos mencionar, la facilidad con la que podemos estandarizar la información que vamos a almacenar dentro de nuestra base de datos, por ejemplo, si te fijas en el código de arriba, esta función lo que hace es guardar el nombre en mayúsculas, sin importar el formato en el que este pueda venir, algo conveniente de cara a mantener un estándar en el formato de nuestros datos.&lt;/p&gt;

&lt;p&gt;Por otro lado, con los mutators también podemos detectar el cambio en alguna propiedad de nuestros modelos, lo que nos ayudaría en el caso de tener que modificar tanto el formato que entra a nuestra propiedad, como cualquier otra que debiera cambiar como un efecto necesario para mantener la coherencia en la información, ejemplo de ello pudiera ser los llamados ‘slugs’. Antes de pasar al ejemplo, debemos tener en cuenta que la siguiente es una forma entre muchas   que existen, siendo alguna incluso más conveniente para hacer este cambio, pero para fines prácticos de la lección nos viene perfecto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;setNameAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;slug&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Str&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;strtoupper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como es costumbre vayamos a la consola y hagamos la consulta respectiva de la siguiente manera:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;App\Models\Product&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#4056&lt;/span&gt;
     &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Collares"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;slug&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"collares"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="err"&gt;…&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Collares PARA perrOs"&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Collares PARA perrOs"&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="c1"&gt;//Nombre mutado&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"COLLARES PARA PERROS"&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;slug&lt;/span&gt;  &lt;span class="c1"&gt;//Slug generado por el mutator&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"collares-para-perros"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Observemos como en primer lugar, el name de nuestro producto y su slug se imprimen según el valor almacenado en la base de datos, al asignarle un nuevo nombre, nuestro mutator ha modificado el formato extraño que le hemos dado, convirtiendo toda la cadena a mayúsculas modificando al mismo tiempo el slug, manteniendo así la coherencia entre ambos datos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Casts:
&lt;/h2&gt;

&lt;p&gt;Como sabemos, los modelos de Laravel poseen una variedad de propiedades que los dotan de múltiples funciones y utilidades, siendo &lt;code&gt;casts&lt;/code&gt; una de ella y, como bien se señala en su documentación, esta propiedad “proporciona un método práctico de convertir atributos en tipos de datos comunes”, haciendo este trabajo de manera automática al obtener y/o capturar el valor del atributo declarado, veamos cómo funciona:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;…&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;active&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Observemos como el campo active, aun cuando en la migración esta declarado como &lt;code&gt;boolean&lt;/code&gt;, nuestro modelo lo representa con valor &lt;code&gt;int&lt;/code&gt; de “1”. Cambiemos esto y hagamos que active se vea como un verdadero boolean:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// En nuestro modelo&lt;/span&gt;
&lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nv"&gt;$casts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'active'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'boolean'&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="c1"&gt;//En tinker&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;…&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;active&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora nuestro campo active dejó de verse como un tipo &lt;code&gt;int&lt;/code&gt; y ahora luce como todo un &lt;code&gt;boolean&lt;/code&gt;, encargándose el modelo de esta tarea de manera automática. Otra propiedad con una misión similar es &lt;code&gt;dates&lt;/code&gt;, pero como podemos notar se enfoca solo en datos tipos fecha, sin embargo, su uso podríamos decir que es obligatorio, no porque Laravel y sus modelos así nos lo imponga, sino por los exagerados beneficios que esta nos brinda.&lt;/p&gt;

&lt;p&gt;Cuando trabajamos con fechas, es siempre un constante dolor de cabeza el solo pensar todo lo que a ellas se refiere, desde distintos formatos de entrada y salida, necesidad de trabajar con partes específicas de ellas (como el día, mes u hora), operaciones entre ellas, validaciones, hasta un sin fin de otros inconvenientes que su uso conlleva, por suerte, existe un extraordinario paquete llamado Carbon, el cual ya tiene todo pensado y nos facilita este enorme trabajo. La razón de que hablemos de este grandioso paquete es porque, cuando declaramos un atributo dentro de la propiedad &lt;code&gt;dates&lt;/code&gt;, nuestro modelo se encargará de tomar nuestra fecha de la base de datos y convertirla en un objeto &lt;code&gt;Carbon&lt;/code&gt;, con esto, podremos hacer uso de todas sus ventajas haciendo nuestra vida más fácil.&lt;/p&gt;

&lt;p&gt;Aunque en nuestro ejemplo de hoy no hemos agregado ningún atributo tipo date, basta con que sepamos que al igual que los casts, basta con declarar nuestro campo tipo fecha dentro del array &lt;code&gt;dates&lt;/code&gt;, sin embargo, para ilustrar un poco el poder de trabajar con este tipo de objeto, podemos elegir cualquiera de los campos &lt;code&gt;created_at&lt;/code&gt; y &lt;code&gt;updated_at&lt;/code&gt;, (también &lt;code&gt;deleted_at&lt;/code&gt; si estamos trabajando con softdeletes) y verlos en acción. Cuando llamamos a cualquiera de estos campos, podremos ver que los mismos son una instancia del objeto &lt;code&gt;Carbon&lt;/code&gt;, por lo que podremos hacer cosas como estas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;diffForHumans&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"25 minutes before"&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;toDateString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"2021-06-06"&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addYears&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;toDayDateTimeString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Sat, Jun 6, 2026 12:08 AM"&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;toDateTimeString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"2021-06-06 00:08:39"&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;toDayDateTimeString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Sun, Jun 6, 2021 12:08 AM"&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;monthName&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"June"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como puedes ver, con solo tener un objeto carbon, podemos hacer un sin fin de cosas, aquí solo mostramos unas pocas utilidades, pero la invitación está abierta para revisar todo lo que este maravilloso paquete nos ofrece. Podemos visitar el siguiente enlace para &lt;a href="https://carbon.nesbot.com/docs/"&gt;CARBON&lt;/a&gt; y conocer un poco más sobre él.&lt;/p&gt;

&lt;p&gt;Por último, nos queda conocer los llamados custom casts. Al igual que &lt;code&gt;casts&lt;/code&gt;, con ellos podemos modificar el tipo de dato de nuestros campos, pero en este caso, este tipo de dato no será un tipo básico, en su lugar, será un tipo de dato construido por nosotros mediante una clase destinada a ello.&lt;/p&gt;

&lt;p&gt;En nuestro ejemplo definimos un campo tipo &lt;code&gt;json&lt;/code&gt; llamado options, su misión es contener información adicional del producto, la cual por conveniencia debemos guardarla en este formato, sin embargo, al momento de recuperar a información, necesitamos que esta información se comporte de una manera que ningún tipo de dato básico puede hacerlo, queremos poder moldear este comportamiento y dotarlo de ciertas mejoras que faciliten nuestro trabajo d desarrollo, para ello hagamos lo siguiente:&lt;/p&gt;

&lt;h3&gt;
  
  
  Paso1
&lt;/h3&gt;

&lt;p&gt;Primero vamos a crear una clase que se encargue de darle cierto comportamiento a nuestro atributo. Esta clase sera un Value Object, en ella podremos darle el comportamiento que deseamos a nuestro atributo, pero no tenemos ningún comando para crearla, así que debemos proceder manualmente:&lt;/p&gt;

&lt;p&gt;Creamos un archivo llamado OptionVO.php dentro del directorio App/ValueObjects,y coloquemos lo siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OptionsVO&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="no"&gt;COLOR_HEX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'rojo'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'#FF0000'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'verde'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'#00FF00'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'azul'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'#0000FF'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$color&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;data_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$options&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'color'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;colorHex&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;COLOR_HEX&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;toArray&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'color'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;
        &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;toJson&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;json_encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;toArray&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Básicamente, solo estamos creando un objeto con una propiedad que retorna el valor almacenado en la base de datos, un método el cual nos devuelve el equivalente hexadecimal según el color, y un par de métodos más que devuelven a nuestro objeto en un formato específico (json y array), estos últimos nos ayudarán cuando hagamos la implementación de la clase &lt;code&gt;casteable&lt;/code&gt;. El comportamiento dado es bastante simple, además solo estamos pasando una sola propiedad, pero podemos sentirnos libres de ser creativos y agregar lo que queramos y/o necesitemos.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Los Value Object son útiles en el modelado de aplicaciones, mediante su implementación, podemos dar forma a conceptos de menor peso dentro de ellas, como pueden ser direcciones, fechas, unidades de medidas o conversión, entre otros.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Paso 2
&lt;/h3&gt;

&lt;p&gt;Ahora tenemos que crear la clase que se encargará de la magia de la transformación, valiéndonos esta vez del comando creado para esta tarea, vamos a la consola y ejecutemos lo siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt; &lt;span class="n"&gt;artisan&lt;/span&gt; &lt;span class="n"&gt;make&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;cast&lt;/span&gt; &lt;span class="nc"&gt;ProductOptionsCast&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto creará un archivo en el directorio App/Casts, con el nombre que le demos a nuestra clase, en el depositaremos el siguiente código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$attributes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OptionsVO&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;json_decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$attributes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;$value&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nc"&gt;OptionsVO&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;InvalidArgumentException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'The given value is not an OptionsVO instance.'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'options'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;toJson&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esta clase está compuesta por dos métodos: El primero de ellos es &lt;code&gt;get&lt;/code&gt;, este se ejecuta al momento de recuperar la información almacenada en la base de datos, la cual recordemos se encuentra en formato json, así que lo decodificamos y construimos un objeto &lt;code&gt;OptionsVO&lt;/code&gt; a partir del resultado. El segundo es &lt;code&gt;set&lt;/code&gt; y se activa cuando se le asigna un valor a la propiedad, que en nuestro caso es options, este debe recibir una instancia del objeto &lt;code&gt;OptionsVO&lt;/code&gt; para que funcione, de lo contrario salta una exception.&lt;/p&gt;

&lt;h3&gt;
  
  
  Paso 3
&lt;/h3&gt;

&lt;p&gt;Por último, debemos indicarle al modelo &lt;code&gt;Product&lt;/code&gt; que debe modificar el tipo de dato de su propiedad options, para lo cual procedemos de la misma manera que ya vimos más arriba con respecto a &lt;code&gt;$cast&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;//Modelo Product.php&lt;/span&gt;
&lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nv"&gt;$casts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="err"&gt;…&lt;/span&gt;
    &lt;span class="s1"&gt;'options'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;ProductOptionsCast&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y con esto es suficiente, ahora podemos hacer uso de nuestro nuevo tipo options:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;App\Models\Product&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#3338&lt;/span&gt;
    &lt;span class="mf"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"{"&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="s2"&gt;": "&lt;/span&gt;&lt;span class="n"&gt;azul&lt;/span&gt;&lt;span class="s2"&gt;"}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mf"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;App\Valuebjects\OptionsVO&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#4267&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"azul"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"azul"&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;colorHex&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"#0000FF"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;¡Lo hemos hecho!, nuestro casts trabaja perfectamente y sin mayores complicaciones, si necesitamos agregar más comportamiento, todo se encuentra encapsulado en una sola clase, lo que facilitará muchos nuestro trabajo al momento de la integración de nuevas options.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nota
&lt;/h3&gt;

&lt;p&gt;Antes de finalizar por hoy, debemos saber que quedan algunas modificaciones que debemos hacer en cuanto a la factory y el seeder de los productos para que no se rompa la aplicación al momento de crear o sembrar nuevos registros. Queda como ejercicio el realizar dichas modificaciones, pero siempre podemos ver la solución en el repositorio de la serie.&lt;/p&gt;

&lt;p&gt;Quédate atento a la próxima entrega, si tienes alguna duda puedes contactarme en mi cuenta de twitter &lt;a href="https://twitter.com/JohanTovar"&gt;@johantovar&lt;/a&gt; o déjala en los comentarios. Hasta entonces y que tengas un feliz y exitoso día.&lt;/p&gt;

&lt;p&gt;Repositorio de práctica: &lt;a href="https://github.com/jtovarto/serie-eloquent-con-ejemplo"&gt;jtovarto/serie-eloquent-con-ejemplo&lt;/a&gt;&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>eloquent</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Aprende eloquent con ejemplos!!! Lección 5 - Global scopes, Soft-deletes y Traits</title>
      <dc:creator>Johan Tovar</dc:creator>
      <pubDate>Mon, 17 May 2021 00:49:33 +0000</pubDate>
      <link>https://dev.to/johantovar/aprende-eloquent-con-ejemplos-leccion-5-global-scopes-soft-deletes-y-traits-3c72</link>
      <guid>https://dev.to/johantovar/aprende-eloquent-con-ejemplos-leccion-5-global-scopes-soft-deletes-y-traits-3c72</guid>
      <description>&lt;p&gt;¡Bienvenido a la lección cinco de Eloquent con ejemplos!&lt;/p&gt;

&lt;p&gt;Como has podido ver a lo largo de las entregas pasadas, nos hemos enfocado en las herramientas que tenemos a disposición con el marco de laravel, esto claro con el objetivo de agilizar nuestro flujo de trabajo y así podernos enfocar en la resolución de problemas reales de nuestra aplicación. Es primordial tener siempre presente que el aprendizaje es un proceso largo y continuo, si quieres sacar el mayor provecho de todo lo que &lt;strong&gt;Eloquent&lt;/strong&gt; y el marco de Laravel nos ofrece, pues no dejes de chequear la documentación oficial, seguir al tanto de las novedades que semanalmente el equipo de laravel nos revela y por supuesto de repasar y compartir el material que en estas entregas pongo a tu disposición.&lt;/p&gt;

&lt;p&gt;Hasta ahora hemos modificado algo de nuestro código y nos hemos separado un poco de los ejemplos de la fuente original de este curso, sin embargo, la idea y esencia es la misma, pues se trata de ejemplificar con prácticas más realistas que las que nos encontramos comúnmente en diversos tutoriales. En la pasada entrega aprendimos sobre los &lt;strong&gt;model scopes&lt;/strong&gt; (ámbitos locales), no sólo como una forma de agregar cláusulas &lt;code&gt;where&lt;/code&gt; y hacer consultas, sino como una idea de organizar nuestro código. Hoy vamos a ampliar en eso mostrándote que son los &lt;strong&gt;global scopes&lt;/strong&gt; (alcances globales) y la introducción los &lt;strong&gt;traits&lt;/strong&gt; en Laravel.&lt;/p&gt;

&lt;p&gt;Cosas que aprenderemos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Global scopes&lt;/li&gt;
&lt;li&gt;Soft-deletes&lt;/li&gt;
&lt;li&gt;Traits&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Model Scopes:
&lt;/h2&gt;

&lt;p&gt;Los &lt;strong&gt;model scopes&lt;/strong&gt; (alcances globales) no son "globales" en el sentido de una variable global, sino que se aplican a todos los registros de un modelo concreto como adición a cualquier otra restricción. Por lo general, estos están reservados para más restricciones a nivel de sistema y pueden funcionar junto con un &lt;strong&gt;trait&lt;/strong&gt; como &lt;strong&gt;soft-deletes&lt;/strong&gt; que analizaremos más adelante en esta lección o requisitos de multiinquilino (multi-tenant).&lt;/p&gt;

&lt;p&gt;Hay dos maneras de usar &lt;strong&gt;global scope&lt;/strong&gt;; creando una clase independiente o simplemente usando el propio modelo. Una clase independiente hace que el ámbito sea reutilizable, por supuesto, ya que, podría extenderla a cualquier modelo que la requiera, en el segundo solo estaría dentro del modelo donde declaremos el &lt;strong&gt;global scope&lt;/strong&gt;. Veamos este último caso aplicando un &lt;strong&gt;global scope&lt;/strong&gt; en nuestro modelo Dog para el manejo de edades de nuestros caninos.&lt;/p&gt;

&lt;p&gt;En primer lugar, vayamos a nuestro modelo Dog.php e importemos la clase Builder que necesitaremos para que todo esto funcione:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Database\Eloquent\Builder&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La mayoría de las clases Laravel tienen una función &lt;code&gt;boot&lt;/code&gt; que se llama como parte de la creación de instancias de la clase. Aquí es donde normalmente registramos cosas como observables y eventos, así como agregar nuestro &lt;strong&gt;global scope&lt;/strong&gt; en este ejemplo. Recuerda que debes asegurarte de llamar al método &lt;code&gt;parent&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;boot&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;//llamado al método boot padre&lt;/span&gt;
    &lt;span class="k"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;boot&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

   &lt;span class="c1"&gt;//nuestro global scope&lt;/span&gt;
    &lt;span class="k"&gt;static&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;addGlobalScope&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'age'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Builder&lt;/span&gt; &lt;span class="nv"&gt;$builder&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$builder&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'age'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;El método &lt;code&gt;addGlobalScope()&lt;/code&gt; admite dos parámetros, en el primero de ellos pasamos una cadena que corresponde al nombre de nuestro &lt;strong&gt;global scope&lt;/strong&gt;, con la que nos referiremos mas adelante cuando necesitemos invocarlo (en este caso ‘age’), el segundo es un &lt;strong&gt;closure&lt;/strong&gt; en el que especificamos las condiciones con las que filtraremos nuestra respuesta.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Con el método anterior, lo que hemos hechos es restringir nuestra consulta &lt;code&gt;all()&lt;/code&gt; aplicando un filtro para que solo nos devuelva aquellos caninos cuya edad sea mayor a 8, de esta manera, si haz seguido el curso hasta acá, verás como al hacer la consulta obtendremos solo un resultado, la bella Jane:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ejecutamos tinker y aplicamos la consulta&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;App\Models\Dog&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Database\Eloquent\Collection&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#4057&lt;/span&gt;
     &lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
       &lt;span class="nc"&gt;App\Models\Dog&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#4058&lt;/span&gt;
         &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Jane"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="n"&gt;gender&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"female"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2021-05-02 23:13:42"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="n"&gt;updated_at&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2021-05-02 23:13:42"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="p"&gt;},&lt;/span&gt;
     &lt;span class="p"&gt;],&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como podrás ver, no hemos usado ningún método adicional como si lo hicimos en la entrega pasada con los &lt;strong&gt;local scopes&lt;/strong&gt;, acá solo le indicamos a la aplicación que nos devuelva TODOS los registros de nuestros modelos, siendo ese “todos” aquellos registros que cumplen con la condición definida.&lt;/p&gt;

&lt;p&gt;En tal sentido, es importante dejar claro, que a partir de la declaración de este &lt;strong&gt;global scope&lt;/strong&gt;, nuestra aplicación siempre ignorará cualquier otro registro que no cumpla con el criterio dado, por lo que cada vez que invoques al modelo Dog, este solo tomará en cuenta aquellos que si lo cumplen, veámoslo con un ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;
&lt;span class="c1"&gt;//Solicitamos el perro con ID 2 cuya edad es 7&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;App\Models\Dog&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;//Obtenemos null&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como podrás observar, al hacer una consulta sobre un registro específico, en este caso el &lt;code&gt;ID&lt;/code&gt; con valor &lt;strong&gt;2&lt;/strong&gt;, la respuesta obtenida es null, a pesar que en nuestra base de datos esta registrado nuestro amigo Jock, esto debido a que no cumple con el criterio establecido, lo mismo ocurrirá con el llamado a otros métodos como el de actualizar el registro, así que ten esto presente cuando vayas hacer uso de esta útil herramienta.&lt;/p&gt;

&lt;p&gt;Ahora bien, a pesar del comportamiento explicado arriba, aún es posible acceder al verdadero TODOS de nuestra tabla &lt;code&gt;dogs&lt;/code&gt;, entiéndase el resultado que obteníamos ante de la declaración de nuestro &lt;strong&gt;global scope&lt;/strong&gt;, para ello podemos hacer uso de la siguiente instrucción:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// trae todos los 4 registros&lt;/span&gt;
&lt;span class="nc"&gt;App\Models\Dog&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;withoutGlobalScope&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'age'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora si obtendremos todos los registros contenidos en nuestra tabla, tal y como lo habríamos obtenido con un simple &lt;code&gt;all()&lt;/code&gt; sin la declaración del &lt;strong&gt;global scope&lt;/strong&gt;. Presta atención al hecho de que al método &lt;code&gt;withoutGlobalScope()&lt;/code&gt; pasamos como parámetro el nombre del scope, algo perfectamente útil si tenemos varios &lt;strong&gt;scopes&lt;/strong&gt; declarados y solo queremos eludir alguno(s) de ellos.&lt;/p&gt;

&lt;p&gt;Es una recomendación obligatoria el dejar notas y/o comentarios dentro del modelo explicando el uso de los &lt;strong&gt;global scope&lt;/strong&gt; que declaramos, esto con la finalidad de no crear dudas sobre posibles resultados que se obtengan al hacer consultas o cualquier otra acción que se vea afectado por dichos &lt;strong&gt;scopes&lt;/strong&gt;, resultaría bastante frustrante para cualquier desarrollador el no poder entender porque no obtiene la respuesta esperada, lo que llevaría quizás mucho tiempo escudriñando y realizando pruebas para dar al fin con la causa. Puede parecer obvio cuando está leyendo este sencillo ejemplo, pero agregue DocBlocks, anotaciones y todas las demás capturas que encuentre en un código base en vivo real y evitar pérdida de tiempo valioso en un futuro!&lt;/p&gt;

&lt;h2&gt;
  
  
  Soft-deletes:
&lt;/h2&gt;

&lt;p&gt;Todos saben que es mejor no eliminar los registros de la base de datos, ¿verdad? Puede sonar un poco a broma puesto que muchos programadores de bases de datos son un anatema respecto a borrar cualquier cosa, pero es un asunto serio. En realidad, la eliminación de registros - especialmente accidentalmente - puede conducir a todo tipo de problemas, como registros huérfanos y falta de datos históricos para su análisis. Es mucho mejor práctica "marcarlos" como activos o no. Sin embargo, hacer esto significa agregar un campo &lt;strong&gt;"active_flag"&lt;/strong&gt; en todas las tablas y luego recordar ponerlo en todas las cláusulas &lt;code&gt;where&lt;/code&gt;. No es lo ideal. Lo bueno es que laravel ya lo tiene resuelto ¡Global scopes!&lt;/p&gt;

&lt;p&gt;Debido a que este tipo de &lt;strong&gt;global scope&lt;/strong&gt; es tan universalmente deseado, Laravel ha hecho lo que Laravel hace mejor - han preparado una solución fácil de usar llamada &lt;em&gt;"Soft Deletes"&lt;/em&gt;. Funciona entre bastidores, en combinación con algunas funciones adicionales, para marcar los registros eliminados con un campo de marca de tiempo llamado &lt;em&gt;"deleted_at"&lt;/em&gt;. ¡Incluso hay una función de migraciones para agregar esto!&lt;/p&gt;

&lt;p&gt;Aunque &lt;strong&gt;soft-deletes&lt;/strong&gt; trabaja como un &lt;strong&gt;global scope&lt;/strong&gt;, su configuración es ligeramente diferente a como te mostré más arriba, así que echemos un vistazo rápido.&lt;/p&gt;

&lt;p&gt;Debemos empezar por agregar el campo correspondiente en nuestra migración. Aunque podemos agregarlo dentro de la migración existente, es recomendado siempre ir paso a paso y crear un nuevo archivo que lo haga, así llevamos una secuencia de la evolución de nuestras migraciones y por ende de nuestra aplicación, así que vayamos a la terminal y ejecutemos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt; &lt;span class="n"&gt;artisan&lt;/span&gt; &lt;span class="n"&gt;make&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;migration&lt;/span&gt; &lt;span class="n"&gt;add_softdeletes_to_dogs_table&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto creará nuestro un archivo migrations, vamos a abrirlo y coloquemos lo siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AddSoftdeletesToDogsTable&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Migration&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cd"&gt;/**
     * Run the migrations.
     *
     * @return void
     */&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;up&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'dogs'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Blueprint&lt;/span&gt; &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;softDeletes&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="cd"&gt;/**
     * Reverse the migrations.
     *
     * @return void
     */&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;down&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'dogs'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Blueprint&lt;/span&gt; &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
             &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;dropSoftDeletes&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ya solo queda correr nuevamente el comando migrate (a estas alturas ya debería saber cómo), y listo, si revisas la base de datos veras que se ha agrado un nuevo campo a la tabla dogs:  &lt;code&gt;deleted_at&lt;/code&gt;, el cual acepta valores NULL.&lt;/p&gt;

&lt;p&gt;Como siguiente paso, debemos indicarle a nuestro modelo Dog que haga uso de esta función y del nuevo campo, para ello, demos ir hasta él y agregar lo siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;//importamos la librería&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Database\Eloquent\SoftDeletes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Model&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;//Invocamos el trait&lt;/span&gt;
    &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;SoftDeletes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;También queremos que el campo &lt;code&gt;deleted_at&lt;/code&gt; sea una instancia del objeto Carbon. Esta es una característica realmente encantadora de Laravel. Para hacer esto, solo tenemos que agregar cualquier campo fecha al atributo $dates en la parte superior del modelo de la siguiente forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nv"&gt;$dates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'deleted_at'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cualquier campo tipo fecha que coloques dentro de este array se convertirá en una instancia de clase Carbon. Esto te da una multitud de funciones fáciles de trabajar cuando necesitas formatear, comparar o manipular fechas. Si quieres saber más (y sugiero que lo hagas) pues revisar la documentación de &lt;a href="https://carbon.nesbot.com/docs/"&gt;Carbon&lt;/a&gt; en su sitio oficial.&lt;/p&gt;

&lt;p&gt;¡Eso es todo! ¡Ya terminaste! El uso de la función &lt;strong&gt;Eloquent&lt;/strong&gt; &lt;code&gt;delete()&lt;/code&gt; marcará automáticamente el &lt;code&gt;timestamp&lt;/code&gt; de ese registro como eliminado, y ya no aparecerá en ningún resultado a menos que ignore específicamente el ámbito, esto es porque &lt;strong&gt;soft-deletes&lt;/strong&gt; actua filtrando todos los registros que tengan el campo &lt;code&gt;deleted_at&lt;/code&gt; igualo a &lt;code&gt;NULL&lt;/code&gt; y devolviéndolos. Todas las instrucciones que hacen posible el trabajo de &lt;strong&gt;soft-deletes&lt;/strong&gt;, se encuentran depositadas en el trait que invocamos dentro de nuestro modelo, lo que la hace totalmente reutilizable y adaptable a cualquier modelo que tenga tu aplicación. Como nota importante a este punto, te recomiendo que evites actualizar el campo &lt;code&gt;deleted_at&lt;/code&gt; manualmente, si quieres ver como manipular este campo y/o ver como adaptar esta herramienta a tus necesidades, deberías dirigirte a la documentación oficial de laravel sobre &lt;a href="https://laravel.com/docs/8.x/eloquent#soft-deleting"&gt;soft-deletes&lt;/a&gt; o darle un ojo al &lt;strong&gt;trait&lt;/strong&gt;, siempre es bueno y muy educativo leer el código que otros escriben.&lt;/p&gt;

&lt;h2&gt;
  
  
  Traits:
&lt;/h2&gt;

&lt;p&gt;Tendemos a usar &lt;em&gt;traits&lt;/em&gt; en Laravel para agrupar funciones relacionadas, incluso si no están destinadas a ser reutilizadas con otras clases. Si abres SoftDeletes en tu IDE, verás un ejemplo en el que claramente se están reutilizando, pero en casos como el sistema de autenticación, que también se basa en &lt;em&gt;traits&lt;/em&gt;, se usan para mantener todas las funciones de contraseña, funciones de restablecimiento, entre otras, juntas para un espacio de trabajo más limpio.&lt;/p&gt;

&lt;p&gt;Los &lt;em&gt;traits&lt;/em&gt; no son parte de laravel en sí mismo, pues son un elemento directo del propio PHP, en ellos no hay secretos ocultos o clases abstractas de las que se deba heredar. Su utilidad es bastante amplia, pues nos permite depositar nuestra lógica dentro de ellas y poder ser reutilizada donde sea que se necesite. Para usar un trait solo basta con crearlo (normalmente en un nuevo directorio Traits), e importarlo en la clase que lo necesite a través del &lt;em&gt;"use FooTrait"&lt;/em&gt; en la parte superior y listo.&lt;/p&gt;

&lt;p&gt;Su uso es muy versatil, por ejemplo es muy común para mi usarlo en los modelos, en particular he trabajado en varios proyectos en donde se ha hecho necesario que el &lt;code&gt;ID&lt;/code&gt; de las tablas sean mucho más complejos que un simple entero incremental, o también que contengan un campo &lt;code&gt;slug&lt;/code&gt;, este tipo de necesidades siempre las soluciono a través de un &lt;em&gt;trait&lt;/em&gt;, lo que me permite reutilizar el mismo código en todos mis modelos estando depositado este en un solo lugar y solo siendo invocado en donde lo necesito, así de simple, también son usados a menudo en controladores como funciones auxiliares, lo que permite que el controlador simplemente enumere las funciones principales de ruta y cambie todas las funciones de "acción" a una clase de servicio independiente. Esto realmente se reduce a tu propio estilo y preferencia – toma solo lo que tenga sentido para ti y te ayude a mantener tu código limpio.&lt;/p&gt;

&lt;p&gt;Espero que estas primeras lecciones te estén ayudando a crear confianza con las herramientas que Laravel ofrece, puestas allí para ayudarte, y que estés empezando a ver cuánto puedes mejorar y ser más productivo en tus aplicaciones si confías en ellas.&lt;/p&gt;

&lt;p&gt;En las próximas entregas vamos a estudiar la presentación de nuestros datos, así como la creación y actualización de registros, algunas técnicas más avanzadas con &lt;code&gt;where()&lt;/code&gt; y un primer vistazo a las relaciones.&lt;/p&gt;

&lt;p&gt;Quédate atento a la próxima entrega, si tienes alguna duda puedes contactarme en mi cuenta de twitter &lt;a class="mentioned-user" href="https://dev.to/johantovar"&gt;@johantovar&lt;/a&gt;
 o déjala en los comentarios. Hasta entonces y que tengas un feliz y exitoso inicio de semana.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nota
&lt;/h2&gt;

&lt;p&gt;Aprovecho para compartir un pequeño repositorio de lo que hemos visto hasta ahora, la verdad todo ha sido muy sencillo, sin embargo, para quienes quieran hacer sus propias pruebas o revisar algo que quizás se les haya escapado, pues les dejo el &lt;a href="https://github.com/jtovarto/serie-eloquent-con-ejemplo"&gt;link del repositorio&lt;/a&gt;, espero les sea de ayuda.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>eloquent</category>
      <category>webdev</category>
      <category>php</category>
    </item>
    <item>
      <title>Aprende eloquent con ejemplos!!! Lección 4  - Model Scopes</title>
      <dc:creator>Johan Tovar</dc:creator>
      <pubDate>Mon, 03 May 2021 01:12:44 +0000</pubDate>
      <link>https://dev.to/johantovar/aprende-eloquent-con-ejemplos-leccion-4-model-scopes-e7</link>
      <guid>https://dev.to/johantovar/aprende-eloquent-con-ejemplos-leccion-4-model-scopes-e7</guid>
      <description>&lt;p&gt;Bienvenidos de nuevo a &lt;strong&gt;“Eloquent con ejemplos”&lt;/strong&gt;, en la  pasada entrega aprendimos los conceptos básicos de los &lt;strong&gt;Modelos&lt;/strong&gt; y una nueva herramienta llamada &lt;strong&gt;Tinker&lt;/strong&gt;. Hasta ahora hemos tocado solamente un poco de la superficie de &lt;strong&gt;Eloquent&lt;/strong&gt; y su funcionamiento, como habrás notado, a pesar de que este es un curso de Laravel, todavía no hemos construido ninguna ruta o páginas web!&lt;/p&gt;

&lt;p&gt;Laravel es un ecosistema muy grande que abarca mucho más que las páginas web estándar. Aprender a mirar una sección aislada de ella, como lo estamos haciendo con &lt;strong&gt;Eloquent&lt;/strong&gt;, será muy útil para desarrollar tanto nuestra velocidad y flujo de trabajo, como nuestra comprensión de cada uno de ellas, por lo tanto, seguiremos trabajando con la línea de comandos y Tinker por un tiempo más. Puede sentirse un poco incómodo si no estás acostumbrado a trabajar de esta manera, pero al final tendrá grandes beneficios.&lt;/p&gt;

&lt;p&gt;En esta lección vamos a empezar a hacer algunas consultas de base de datos!&lt;/p&gt;

&lt;p&gt;Cosas que aprenderemos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Model scopes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Uno de los mayores objetivos de esta serie es ayudar a las personas a ser competentes, y no sólo conocedoras, sobre el uso de las herramientas &lt;strong&gt;&lt;code&gt;artisan&lt;/code&gt;&lt;/strong&gt;, es por ello que repasaremos una vez más como construir nuestras tablas y datos. ¡No te preocupes, solo será un repaso y lo haremos rápidamente!&lt;/p&gt;

&lt;p&gt;1) Aquí hay un comando que aún no hemos utilizado con &lt;strong&gt;migrate&lt;/strong&gt; - &lt;strong&gt;"reset"&lt;/strong&gt;. Esto revertirá todas las migraciones para que podamos empezar de nuevo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan migrate:reset
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2) Eliminemos los archivos creados en entregas pasadas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El factory DogFactory&lt;/li&gt;
&lt;li&gt;El seeder DogsTableSeeder&lt;/li&gt;
&lt;li&gt;El modelo Dog&lt;/li&gt;
&lt;li&gt;La migración _create_dogs_table&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Probablemente deberías ejecutar en la terminal &lt;strong&gt;&lt;code&gt;composer dump-autoload&lt;/code&gt;&lt;/strong&gt;, ya que los archivos a veces se registran en el cargador automático y causan problemas más adelante cuando están "desaparecidos".&lt;/p&gt;

&lt;p&gt;3) ¿Recuerda cómo hacer la migración y el modelo al mismo tiempo? ¡Espero que si!, igual aquí tienes la respuesta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan make:model Dogs -mfs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto crea nuestro &lt;em&gt;modelo&lt;/em&gt;, junto con la &lt;em&gt;migración&lt;/em&gt;, &lt;em&gt;factory&lt;/em&gt; y &lt;em&gt;seeder&lt;/em&gt; respectivamente.&lt;/p&gt;

&lt;p&gt;4) En nuestra migración, queremos que los perros tengan un nombre, un género y un campo de edad. Agrega a la función &lt;strong&gt;&lt;code&gt;up()&lt;/code&gt;&lt;/strong&gt; dichos campos, de manera que te quede así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;up&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'dogs'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Blueprint&lt;/span&gt; &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;increments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'gender'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;nullable&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;integer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'age'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;nullable&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;timestamps&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;5) Para este ejercicio, todos deberíamos tener los mismos datos para que podamos hacer algunas consultas específicas, por lo que usaremos &lt;strong&gt;model factories&lt;/strong&gt; para crear introducir datos semillas en lugar de usar Faker. Vayamos a nuestro DogSeeder y coloquemos el siguiente código:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Aunque usamos &lt;em&gt;model factories&lt;/em&gt;, no la configuraremos todavía como es debido, si embargo esto no impedirá que la usemos sin problemas. En proximas lecciones nos dedicaremos a establecer nuestra factory como es debido.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Dog&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Joe'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'age'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="n"&gt;gender&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="n"&gt;male&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="nc"&gt;Dog&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Jock'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'age'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="n"&gt;gender&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="n"&gt;male&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt; &lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="nc"&gt;Dog&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Jessie'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'age'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="n"&gt;gender&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="n"&gt;female&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt; &lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="nc"&gt;Dog&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Jane'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'age'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="n"&gt;gender&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="n"&gt;female&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt; &lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;1) Configuremos el archivo seeder central para que ejecute nuestro nuevo DogSeeder. Para esto, debemos ubicarnos en el archivo &lt;strong&gt;&lt;code&gt;database\seeders\DatabaseSeeder&lt;/code&gt;&lt;/strong&gt; y hacer la siguiente invocación:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;DogSeeder&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;7) Finalmente ejecutemos nuestras migraciones junto con los archivos seeders:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt; &lt;span class="n"&gt;artisan&lt;/span&gt; &lt;span class="n"&gt;migrate&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;seed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Model scopes:
&lt;/h2&gt;

&lt;p&gt;Muy bien, ejecutemos Tinker y empecemos a consultar!&lt;/p&gt;

&lt;p&gt;Tenemos perros de cuatro edades distintas (2, 5, 7 y 9 años), dos de ellos son hembras y dos son machos. Nos gustaría ver a todos los perros mayores de 6 años. La forma sencilla de hacer esto es simplemente poner una cláusula &lt;strong&gt;&lt;code&gt;where()&lt;/code&gt;&lt;/strong&gt; en nuestro modelo &lt;strong&gt;Dog,&lt;/strong&gt; así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt; &lt;span class="n"&gt;artisan&lt;/span&gt; &lt;span class="n"&gt;tinker&lt;/span&gt;
&lt;span class="nc"&gt;Psy&lt;/span&gt; &lt;span class="nc"&gt;Shell&lt;/span&gt; &lt;span class="n"&gt;v0&lt;/span&gt;&lt;span class="mf"&gt;.10.8&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;PHP&lt;/span&gt; &lt;span class="mf"&gt;8.0.5&lt;/span&gt; &lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="n"&gt;cli&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="nc"&gt;Justin&lt;/span&gt; &lt;span class="nc"&gt;Hileman&lt;/span&gt;

&lt;span class="nc"&gt;App\Models\Dog&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'age'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deberías ver a los encantadores Jock y Jane en pantalla.&lt;/p&gt;

&lt;p&gt;Algo que confunde a muchas personas cuando comienzan con Eloquent es el hecho de que este se basa en &lt;strong&gt;QueryBuilder&lt;/strong&gt;, pero los resultados vuelven como un objeto &lt;strong&gt;Collection&lt;/strong&gt;. Esto significa que vas a encontrarte con muchas funciones con nombre similar que parecen ser diferentes dependiendo de si estás creando la consulta o manipulando los registros devueltos. En este caso estamos utilizando &lt;strong&gt;&lt;code&gt;where()&lt;/code&gt;&lt;/strong&gt; para crear una cláusula &lt;em&gt;where&lt;/em&gt; en nuestra consulta, no para filtrar el conjunto de resultados. Para este curso usaremos las funciones &lt;strong&gt;querybuilder&lt;/strong&gt; para crear instrucciones &lt;strong&gt;sql&lt;/strong&gt;, te recomiendo ampliar mas sobre el tema en la documentación oficial de Laravel sobre las &lt;a href="https://laravel.com/docs/8.x/queries"&gt;Query Builder&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;El código que acabamos de ejecutar funciona, pero tiene algunos problemas desde el punto de vista de diseño y mantenimiento. Con este código en nuestro controlador es como si estuviéramos codificando instrucciones &lt;strong&gt;sql&lt;/strong&gt; en toda nuestra aplicación. Imagina que comenzamos a usar dicha instrucción en varios lugares de nuestra aplicación, podría darse el caso que esa edad cambie por alguna razón, obligándonos a tener que a cambiarla en todos y cada uno de esos lugares, tarea bastante tediosa y poco práctica, sin mencionar que podríamos saltarnos uno o varios de ellos, generando posibles errores e inconsistencias. Por otra parte, tampoco dicha instrucción no explica el por qué usamos esa edad en específico o cuales son sus casos de uso y/o de aplicación.&lt;/p&gt;

&lt;p&gt;Usemos algo llamado &lt;strong&gt;"scopes"&lt;/strong&gt; para hacer una restricción más limpia.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Model&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;scopeAgeGreaterThan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$age&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'age'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$age&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;scopeGender&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$gender&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'gender'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;$gender&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como puedes ver, tenemos dos métodos arriba que siguen a una convención de nomenclatura muy específica, un subproceso común en Laravel. La función debe comenzar con &lt;strong&gt;"scope"&lt;/strong&gt; y el primer parámetro será la instancia de &lt;em&gt;QueryBuilder&lt;/em&gt; inyectada, dicho argumento puede tener cualquier nombre que quieras darle, pero normalmente &lt;strong&gt;&lt;code&gt;$q&lt;/code&gt;&lt;/strong&gt; o &lt;strong&gt;&lt;code&gt;$query&lt;/code&gt;&lt;/strong&gt; se utiliza para mayor claridad, depende de ti el nombre y la cantidad de parámetros subsecuentes que quieras inyectar, recomiendo el uso de nombre descriptivos como &lt;strong&gt;&lt;code&gt;$age&lt;/code&gt;&lt;/strong&gt; o &lt;strong&gt;&lt;code&gt;$gender&lt;/code&gt;&lt;/strong&gt; que dan una idea clara de la razón de su existencia dentro de cada método. Ahora puedes utilizar esta función de esta forma (reinicia la sesión de Tinker para que actualice los último cambios):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;App\Models\Dog&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;ageGreaterThan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;→&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aquí hemos usado el primero de nuestros &lt;strong&gt;scopes&lt;/strong&gt;, observa la respuesta en pantalla y verás que es exactamente la misma que hemos obtenido anteriormente, ¿la diferencia?, podremos usarla en cualquier parte de nuestra aplicación, con el plus de solo tener que modificarla en un solo lugar. Por otro lado es bueno mencionar que los &lt;strong&gt;scopes&lt;/strong&gt; toman una instancia de &lt;strong&gt;QueryBuilder&lt;/strong&gt; y la retornan, lo que permite encadenar cualquier cantidad de funciones como varios &lt;strong&gt;&lt;code&gt;where()&lt;/code&gt;, &lt;code&gt;orderBy()&lt;/code&gt;&lt;/strong&gt;, entre otros. Veamos un ejemplo claro.&lt;/p&gt;

&lt;p&gt;Vamos a nuestro modelo, y agreguemos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;App\Models\Dog&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;ageGreaterThan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;gender&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'female'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fácilmente hemos filtrado nuestro primer resultado y ahora solo nos aparece la hermosa Jane en pantalla, sin clausulas &lt;code&gt;where&lt;/code&gt; visibles ni largas líneas de código, todo muy limpio, compacto y totalmente reusable. ¡Genial!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;En la documentación oficial de laravel encontrarás un apartado dedicado al uso de clausulas &lt;em&gt;where&lt;/em&gt; y lo que ellos llaman &lt;a href="https://laravel.com/docs/8.x/queries#logical-grouping"&gt;logical-grouping&lt;/a&gt;. Recomiendo encarecidamente su lectura, te será de mucha ayuda.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Esto es agradable, sin embargo todavía no está muy claro cuál es el propósito de dichos &lt;strong&gt;scopes&lt;/strong&gt;, así que, vamos a darles un sentido: Digamos que a cierta edad, nuestro amigos caninos requieren de un tratamiento especial que les ayudará en su calidad de vida cuando lleguen a una edad avanza, ademas, este tratamiento es diferente según su género. Bajo este supuesto, vamos a hacer algunos cambios en nuestro modelo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Model&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;scopeAgeGreaterThan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$age&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'age'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$age&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;scopeGender&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$gender&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'gender'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;$gender&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

   &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;dogsForSpecialTreatment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$gender&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;AgeGreaterThan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;gender&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$gender&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reiniciemos tinker una vez mas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;App\Models\Dog&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;dogsForSpecialTreatment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'female'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resaltemos un par de cosas en el código de arriba. Tenemos un método común &lt;strong&gt;&lt;code&gt;dogsForSpecialTreatment($gender)&lt;/code&gt;&lt;/strong&gt; en nuestro modelo, el cual hace uso de &lt;strong&gt;scopes&lt;/strong&gt; dentro de sus instrucciones, creando la consulta necesaria para cumplir con los requerimientos de nuestro tratamiento especial, puedes jugar cambiando el género y verás como se alterna el resultado entre Jock y Jane.  Es importante destacar que ahora nuestro modelo tiene un método más descriptivo,  cuyo nombre denota un propósito bien definido. Por otro lado, observa que al hacer uso de este método, ya no lo hacemos de la misma forma que con nuestros &lt;strong&gt;scopes&lt;/strong&gt;, pues a este último accedemos mediante la forma &lt;code&gt;static::&lt;/code&gt;, mientras que a nuestro nuevo método accedemos como a cualquier método de clase común, debiendo para ello crear una instancia de nuestro modelo usando &lt;strong&gt;new&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;El ejemplo anterior se mantiene intencionalmente simple, y por lo tanto, si te preguntas &lt;strong&gt;¿Por qué no hacer un solo **scope&lt;/strong&gt; 'dogsForSpecialTreatment()' con toda la lógica dentro de él?** , pues dejame decirte que estas en lo cierto y tiene sentido. Sin embargo, las aplicaciones del mundo real suelen tener un conjunto de criterios que definen un cierto estado o grupo (por ejemplo, límites de edad o el género), los cuales en algún punto dado, como algún tipo de reporte, se necesita trabajar con algún tipo de subconjunto derivado (todos los perros mayores de 6 años y que sean hembras). Si piensas en diseñar y crear tus modelos a partir de piezas más granulares, en lugar de una gran función completa y monolítica, facilitará el mantenimiento de tus aplicaciones, te mantendrá alejado de la duplicación de código e incluso te ayudará a darle un significado explícito que exprese que es lo que hace, algo de bastante ayuda para cuando vuelvas a hacer cambios unos meses más tarde.&lt;/p&gt;

&lt;p&gt;La siguiente lección introducirá alcances globales &lt;em&gt;(global scopes)&lt;/em&gt;, así como los ámbitos Laravel incorporados, como &lt;em&gt;soft-deletes&lt;/em&gt;. No seguiremos repitiendo todos los pasos de reconstrucción cada día, así que vuelve a esta lección si necesitas ayuda para recordar cómo restablecer la base de datos para lecciones posteriores.&lt;/p&gt;

&lt;p&gt;Quédate atento a la próxima entrega, si tienes alguna duda puedes contactarme en mi cuenta de Twitter &lt;a class="mentioned-user" href="https://dev.to/johantovar"&gt;@johantovar&lt;/a&gt;
  o déjala en los comentarios. Hasta entonces y que tengas un feliz y exitoso día.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>eloquent</category>
      <category>webdev</category>
      <category>php</category>
    </item>
    <item>
      <title>Aprende eloquent con ejemplos!!! - Lección 3: Modelos, Tinker y Base de datos heredadas</title>
      <dc:creator>Johan Tovar</dc:creator>
      <pubDate>Sun, 25 Apr 2021 21:45:06 +0000</pubDate>
      <link>https://dev.to/johantovar/aprende-eloquent-con-ejemplos-leccion-3-modelos-tinker-y-base-de-datos-heredadas-20bi</link>
      <guid>https://dev.to/johantovar/aprende-eloquent-con-ejemplos-leccion-3-modelos-tinker-y-base-de-datos-heredadas-20bi</guid>
      <description>&lt;p&gt;Bienvenidos a esta tercera entrega de &lt;em&gt;Eloquent con ejemplos&lt;/em&gt;.  En la lección pasada aprendimos como poblar de una forma bastante práctica y cómoda nuestra base de datos, dándonos la oportunidad de conocer un poco sobre una pieza fundamental dentro del mundo de Eloquent: &lt;strong&gt;Modelos&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Hoy trataremos de indagar más a fondo dentro de esta importante clase y aprenderemos sobre su gran versatilidad para interactuar con base de datos nuevas y heredadas, conoceremos sobre algunos de sus atributos y uno que otro tip de configuración que nos ayudarán a crear aplicaciones de manera rápida y mantenibles.&lt;/p&gt;

&lt;p&gt;Lo que aprenderemos hoy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Atributos de los Modelos.&lt;/li&gt;
&lt;li&gt;Tinker.&lt;/li&gt;
&lt;li&gt;Trabajar con base de datos heredadas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Empecemos por un pequeño repaso de lo visto en la lección pasada sobre los modelos y partamos de lo que ya habíamos hecho.&lt;/p&gt;

&lt;p&gt;Si revisamos nuestra aplicación vemos que se nos había solicitado la creación de un tabla &lt;code&gt;dogs&lt;/code&gt;, procediendo a crear nuestro modelo &lt;code&gt;Dog&lt;/code&gt; en la terminal y pasándole los respectivos flags de creación de migraciones, factories y seeders, a estas alturas ya deberías saber de que te estoy hablando, si no, échale una ojeada a la entrega anterior.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Recuerda que es importante el uso correcto de las mayúsculas y minúsculas, así como el manejo de las palabras en singular y plural según sea el caso.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pues bien, teniendo todo previamente configurado, vayamos a la consola y ejecutemos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;    &lt;span class="n"&gt;php&lt;/span&gt; &lt;span class="n"&gt;artisan&lt;/span&gt; &lt;span class="n"&gt;tinker&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Veremos como nuestra terminal ha cambiado, mostrándonos el siguiente mensaje:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XOhhKT0k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/esmopdm7o0in9uc30ouc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XOhhKT0k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/esmopdm7o0in9uc30ouc.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lo que hemos hechos es ejecutar una grandioso &lt;strong&gt;REPL&lt;/strong&gt; (&lt;em&gt;Read-Eval-Print-Loop&lt;/em&gt;) llamada &lt;strong&gt;Tinker&lt;/strong&gt;, el cual viene instalado por defecto con Laravel 8, con el, podremos interactuar con nuestras aplicaciones desde nuestra terminal, permitiéndonos hacer pruebas o revisar el funcionamiento de lo que en ellas vamos creando, esto incluye por supuesto a nuestro modelos.  ¡No más llenar nuestra base de código con llamadas dd()!&lt;/p&gt;

&lt;p&gt;Veamos  un ejemplo y ejecutemos la siguiente instrucción:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;   &lt;span class="nv"&gt;$dog&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;App\Models\Dog&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

   &lt;span class="nv"&gt;$dog&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;

   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="nc"&gt;Jack&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verás como en pantalla aparecerá el nombre de nuestro amigo canino guardado con el &lt;em&gt;id = 1&lt;/em&gt;. Como el nombre lo asignamos en nuestro &lt;em&gt;model factory&lt;/em&gt; mediante el uso de la librería &lt;em&gt;Faker&lt;/em&gt;, este será diferente para cada uno de nosotros, lo importante acá es que te aparezca un nombre, eso indica que la configuración que hicimos trabaja perfectamente y que tu modelo esta bien configurado.&lt;/p&gt;

&lt;p&gt;Puedes ir jugando con tus modelos desde esta terminal, debes saber que &lt;strong&gt;Tinker&lt;/strong&gt; recuerda nuestras variables durante una sesión de trabajo, para salir de ella y volver a nuestra consola solo debes teclear &lt;code&gt;exit&lt;/code&gt; y listo. Cuando ingreses nuevamente deberás crear todas tus variables y configurar el entorno que tenías en la sesión anterior, pero ten presente lo siguiente: Toda interacción con la base de datos de inserción, edición y eliminación será registrada en ella de manera permanente, ten en cuenta esto al momento de realizar tus pruebas, no querrás cambiar algo que quizás necesites más adelante.&lt;/p&gt;

&lt;p&gt;Ahora bien, hasta acá todo ha ido bien, pero no se si te haz preguntado, ¿Que pasa si nuestra aplicación  viene trabajando con una base de datos heredada? ¿Es posible trabajar con mis nuevos modelos y conectarlos a esta base de datos? ¿Es eloquent tan versátil y adaptable como para brindarnos tal facilidad?. La respuesta a todo eso es SI!.&lt;/p&gt;

&lt;p&gt;Algunas veces nos encontraremos en situaciones en la que heredamos una base de datos cuya estructura no se adapta exactamente a nuestra aplicación actual o a nuestro marco de trabajo en si, debiendo tomar decisiones que quizás no sean muy convenientes o que incluso necesiten de modificaciones difíciles y/o costosas. Sin embargo, con eloquent, en la gran mayoría de los casos, no es más que hacer unas pequeñas configuraciones y todo estará listo de una manera rápida, fácil y mantenible.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Para poder cubrir bien el ejemplo que te mostraré, deberás ir a tu base de datos y crear la tabla correspondiente e insertar al menos un registro  en ella. Te dejo el código SQL por si quieres hacer uso de él, aunque la puedes crear manualmente sin ningún inconveniente.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="nv"&gt;`TblContacts`&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="nv"&gt;`Contacts_ID`&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="n"&gt;AUTO_INCREMENT&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="nv"&gt;`Contacts_Name`&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="nv"&gt;`Contacts_Email`&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Contacts_ID`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ENGINE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;InnoDB&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="nv"&gt;`TblContacts`&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`Contacts_ID`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`Contacts_Name`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`Contacts_Email`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Jeff'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'jeff@codebyjeff.com'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Veamos un ejemplo:&lt;/p&gt;

&lt;p&gt;Supongamos que nuestra aplicación tiene una tabla llamada  TblContacts, lo que a primera vista denota la imposibilidad de poder hacer uso de la lógica de reflexión que Laravel nos ofrece, pues no se ajusta al standar de nombre al que tantas veces he hecho referencia. Sin embargo, vayamos a nuestra terminal para crear nuestro modelo y tratar de interactuar  con ella:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;    &lt;span class="n"&gt;php&lt;/span&gt; &lt;span class="n"&gt;artisan&lt;/span&gt; &lt;span class="n"&gt;make&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="nc"&gt;Contact&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Abramos Tinker y ejecutemos la siguiente instrucción:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;    &lt;span class="nc"&gt;App\Models\Contact&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vemos como rápidamente nos salta un enorme mensaje de error, en el que, en resumidas cuentas, nos esta indicando que la tabla &lt;code&gt;contacts&lt;/code&gt; no existe, pues nuestra tabla realmente se llama &lt;code&gt;TblContacts&lt;/code&gt; . Ahora bien, ¿como hacemos entonces para que nuestro modelo puede enlazarse con dicha tabla? . Pues esto y mucho más podemos hacerlo a través de los atributos de clase de los modelos.&lt;/p&gt;

&lt;p&gt;Todos nuestros modelos tienen un conjunto de atributos y métodos que nos facilitarán su configuración, dándonos esa versatilidad de uso que necesitamos para adaptarnos a cualquier situación que se nos presente, en este caso, una base de datos heredada.&lt;/p&gt;

&lt;p&gt;Pues, pongamos manos a la obra y configuremos nuestra tabla para que, al usar nuestro modelo &lt;code&gt;Contact&lt;/code&gt; este interactúe con nuestra tabla heredada &lt;code&gt;TblContacts&lt;/code&gt;. Vayamos a nuestro modelo y agreguemos la siguiente propiedad:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Creo que no he hecho mención a que desde la ultima versión de laravel, nuestro modelos se encuentran en &lt;code&gt;App\Models\&lt;/code&gt; a diferencia de versiones anteriores, en las que puedes encontrarlos en  &lt;code&gt;App\&lt;/code&gt;. Ten en cuenta esto al momento de trabajar con tus modelos.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Contact&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Model&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nv"&gt;$table&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'TblContacts'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prueba tu comando Tinker otra vez (tendrás que salir de Tinker y abrirlo de nuevo, lamentablemente las sesiones de Tinker no detectarán cambios de código), verás que devuelve una colección (el objeto devuelto estándar de Eloquent) con una única instancia de modelo del registro que insertamos "Jeff".&lt;/p&gt;

&lt;p&gt;Vamos a probar una idea más en Tinker - vamos a obtener el número de contacto &lt;code&gt;1&lt;/code&gt;. ¿Qué crees que pasará?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;App\Contact&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;"Illuminate\Database\QueryException with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'TblContacts.id' in 'where clause' (SQL: select * from TblContacts where TblContacts.id = 1 limit 1)'"&lt;/p&gt;

&lt;p&gt;Como era de esperar, está buscando una clave principal llamada &lt;code&gt;id&lt;/code&gt; y no la encuentra, pues la clave primaria de nuestra tabla es &lt;code&gt;Contacts_ID&lt;/code&gt;. Eloquent nos ofrece la misma solución fácil y limpia que para nuestra tabla:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Contact&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Model&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nv"&gt;$table&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'TblContacts'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nv"&gt;$primaryKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Contacts_ID'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;y las cosas funcionan bien de nuevo.&lt;/p&gt;

&lt;p&gt;Como podrán ver, la forma en la que podemos configurar nuestros modelos nos abre un abanico de posibilidades, algunas serán para buenas prácticas, otras no lo serán tanto, todo depende de nosotros y el uso que le demos, pero la verdad es que, de la forma en la que se plantean estas configuraciones podremos jugar a nuestras anchas, asignando los valores correspondiente a cada propiedad de clase según nuestra conveniencia.&lt;/p&gt;

&lt;p&gt;Existen muchas otras propiedades de clase que podamos modificar para cambiar el comportamiento de nuestro modelos, por ejemplo, las claves primarias por defecto son de tipo enteros auto-incrementales, esto lo podemos cambiar a través de la propiedad:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Contact&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Model&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nv"&gt;$keyType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'string'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nv"&gt;$incrementing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con este cambio le estamos indicando a nuestro marco que el modelo tiene una clave primaria tipo ‘string’ que no se auto-incremental, lo que es muy útil si queremos ser nosotros quienes generemos nuestras propia claves primarias. Otra propiedad muy importante es &lt;code&gt;protected $connection = 'sqlite';&lt;/code&gt;&lt;br&gt;
, con ella podemos cambiar la conexión a la base de datos, según las configuradas en nuestro archivo &lt;code&gt;config\database.php&lt;/code&gt;, en este caso, activamos la conexión para sqlite, pero esta y otras propiedades las dejaremos para otras entregas más avanzadas y especificas del curso.&lt;/p&gt;

&lt;p&gt;Como último tip de esta entrega, me gustaría enseñarte como hacer para deshacernos de ese arcaico esquema de nombres heredado de nuestra base de datos. Si bien es cierto que hasta ahora todo funciona para nosotros, no debería escapársenos el hecho que los actuales campos de nuestra base de datos fueron construido bajo un esquema de nombres bastante arcaico y lejos de los standares que hoy en día manejamos. El problema al que nos enfrentamos es este: si empezamos a construir nuestra aplicación, nos encontraremos por doquier algo como esto &lt;code&gt;$contact-&amp;gt;Contacs_Name&lt;/code&gt;, lo que supondría, en un futuro,  un trabajo de refactorización bastante laborioso. Realmente nos gustaría poner otra capa entre nuestro modelo y la salida que eventualmente usaremos en las vistas, más acorde a los standares y que sea fácilmente mantenible.&lt;/p&gt;

&lt;p&gt;Por un lado, podemos declarar, dentro de nuestro modelo, un método de acceso a nuestra propiedad, algo muy propio de la Programación Orientada a Objetos (POO),  este podría ser un ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;contactName&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Contacts_Name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora podremos acceder a nuestro valor haciendo uso de &lt;code&gt;$contact-&amp;gt;contactName()&lt;/code&gt;. Esto nos permitirá en un futuro, poder cambiar la salida de nuestro atributo sin que tengamos que hacer ninguna otra modificación dentro de nuestra aplicación. Otra manera de hacer esto mismo puede ser con el uso de los &lt;code&gt;Accesors&lt;/code&gt;, pero eso ya es tema de otra lección más delante.&lt;/p&gt;

&lt;p&gt;Existen otras formas como lo es el uso de un objeto completamente independiente llamado "transformador" que tiene el trabajo de presentar sus datos. Un popular paquete que ayuda a esta implementación es &lt;a href="http://fractal.thephpleague.com"&gt;"Fractals"&lt;/a&gt;, por otra parte, si estas trabajando con API’s, un recurso muy recomendado para esta tarea son los &lt;a href="https://laravel.com/docs/8.x/eloquent-resources"&gt;Eloquent: API Resources&lt;/a&gt;. Ambas implementaciones escapan del ámbito que esta lección pretende abordar, pero realmente son bastante sencillas, así que te invito a que le eches una ojeada a las fuentes si te interesa ampliar más sobre ellas.&lt;/p&gt;

&lt;p&gt;Pues bien, esto ha sido todo por hoy, hemos aprendimos un poco sobre cómo funciona nuestro modelo, y cómo podemos controlarlo para usar tablas heredadas y esquemas de nomenclatura, así como algunos tips para enmascarar la salida de nuestros modelos. Empieza a hacer tus pruebas y jugar con el código, recuerda que el verdadero aprendizaje se da a través de la práctica, si tienes alguna duda o comentario no dudes en contactarme.  Que tengas un feliz y exitoso día.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Aprende eloquent con ejemplos!!! - Lección 2: Faker, Factories, Seeders</title>
      <dc:creator>Johan Tovar</dc:creator>
      <pubDate>Mon, 19 Apr 2021 04:24:24 +0000</pubDate>
      <link>https://dev.to/johantovar/aprende-eloquent-con-ejemplos-leccion-2-faker-factories-seeders-2725</link>
      <guid>https://dev.to/johantovar/aprende-eloquent-con-ejemplos-leccion-2-faker-factories-seeders-2725</guid>
      <description>&lt;p&gt;En la entrega primera entrega de &lt;a href="https://dev.to/johanso/aprende-eloquent-con-ejemplos-2ld7"&gt;Aprende eloquent con ejemplos!!!&lt;/a&gt;, vimos como crear y usar de una manera bastante básica nuestras migraciones y seeders, por lo que en esta lección les enseñaré como podemos darle un mejor uso y hacer que trabajen de manera integral de cara a un flujo de trabajo más eficiente en nuestro desarrollo, para ello, aprenderemos sobre:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Factories&lt;/li&gt;
&lt;li&gt;Faker&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Empezaremos con destruir nuestra migración hecha en la lección pasada, pero debes recordar que aunque podemos ir y borrar nuestro archivo &lt;code&gt;migrations&lt;/code&gt;, eso nos causaría muchas dificultades y molestias, razón por la cual debes proceder a ejecutar en consola el comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;    &lt;span class="n"&gt;php&lt;/span&gt; &lt;span class="n"&gt;artisan&lt;/span&gt; &lt;span class="n"&gt;migrate&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;rollback&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;De esta manera regresaríamos nuestra base de datos a su estado inicial, eliminando la tabla &lt;code&gt;dogs&lt;/code&gt; registrada anteriormente. Hecho esto, podemos ahora si proceder a borrar nuestro archivo &lt;code&gt;migrations&lt;/code&gt; sin temor de dificultades, vayamos al directorio respectivo y eliminar el archivo &lt;code&gt;&amp;lt;timestamp&amp;gt;_create_table_dogs&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Con &lt;code&gt;rollback&lt;/code&gt; devolvimos todas las migraciones ejecutadas, pudimos haber usado el flag &lt;code&gt;--step=1&lt;/code&gt; y solo eliminar nuestra table &lt;code&gt;dogs&lt;/code&gt; dejando las demás intactas. Recuerda que el comando &lt;code&gt;migrate&lt;/code&gt; tiene varias opciones, tomate tu tiempo para repasarlas y probar con ellas.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;En este momento tenemos nuestra base de datos y migraciones en su estado inicial, así que ya podemos dar inicio con nuestra lección. En este sentido, y como una necesidad para poder trabajar con los elementos listados mas arriba, debemos abordar primero un concepto fundamental dentro del mundo de eloquent, el cual paso de seguida a explicarte de que se trata.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conociendo los Modelos
&lt;/h2&gt;

&lt;p&gt;En la pasada lección creamos una tabla y luego insertamos datos en ella a través de nuestro seeder, pero para el momento no contábamos con un modelo Laravel para nuestra tabla &lt;code&gt;dogs&lt;/code&gt; así que tuvimos que hacer  uso de la facade &lt;code&gt;DB&lt;/code&gt; para poder crear nuestro registros.&lt;/p&gt;

&lt;p&gt;Un modelo Laravel es importante para nosotros porque es algo más que una forma de interactuar con nuestra base de datos; es una parte fundamental de nuestro ORM Eloquent y nos ayudará a construir relaciones con otros recursos, establecer eventos que se disparan cuando hacemos ciertas acciones y una serie de otras cosas que estaremos aprendiendo en este curso.&lt;/p&gt;

&lt;p&gt;Así que, teniendo nuestra base de datos como un lienzo en blanco, arrancaremos esta vez haciendo uso de este importante recurso,  cuyo comando de creación es el siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;    &lt;span class="n"&gt;php&lt;/span&gt; &lt;span class="n"&gt;artisan&lt;/span&gt; &lt;span class="n"&gt;make&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;pero como te prometí enseñarte un mejor flujo de trabajo, no sólo una serie de comandos,  en lugar del anterior comando, ejecutaremos el siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;    &lt;span class="n"&gt;php&lt;/span&gt; &lt;span class="n"&gt;artisan&lt;/span&gt; &lt;span class="n"&gt;make&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fm&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A diferencia del primer comando, esta vez le hemos pasado los flags &lt;code&gt;-fm&lt;/code&gt;, lo cual creará no solamente el modelo Dog, si no que además se desencadenan una serie de acciones: se creará el archivo DogFactory ubicado en el directorio &lt;code&gt;database/factories&lt;/code&gt;, también creará nuestro archivo migration en su respectivo directorio. Ve y abre este último, agregale el campo "name" y ejecuta la migración.&lt;/p&gt;

&lt;p&gt;En este momento tenemos un modelo muy simple en el que nos sumergiremos más en la próxima lección. Por ahora,  volvamos a nuestra clase &lt;code&gt;DogsTableSeeder&lt;/code&gt;. En lugar de usar la facade &lt;code&gt;DB&lt;/code&gt;, vamos a recrear esta siembra con el nuevo modelo. Se ve muy similar, pero usamos en su lugar el &lt;em&gt;model factory&lt;/em&gt; que acabamos de crear, deberíamos tener algo como esto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Dog&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Joe'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
        &lt;span class="nc"&gt;Dog&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Jock'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
        &lt;span class="nc"&gt;Dog&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Jackie'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
        &lt;span class="nc"&gt;Dog&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Jane'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;fig. 1&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ejecute esto con:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;    &lt;span class="n"&gt;php&lt;/span&gt; &lt;span class="n"&gt;artisan&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;seed&lt;/span&gt; &lt;span class="err"&gt;–&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;DogsTableSeeder&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;y mira los resultados en la tabla.&lt;/p&gt;

&lt;p&gt;Si haz seguido los pasos hasta acá, verás como en la base de datos tienes una tabla llamada &lt;code&gt;dogs&lt;/code&gt; con cuatro registros, pero a diferencia de lo aprendido en el pasado, no hemos configurado la tabla en la que queríamos registrar a nuestro caninos, sin embargo ahí están, ¿como ha sido posible? pues ahora lo veremos.&lt;/p&gt;

&lt;p&gt;Una de las ventajas de crear nuestros archivos de la manera que lo hicimos es que, con solo darle un nombre a nuestro modelo y pasarle los flags correspondiente, Laravel toma ese nombre y lo maneja según las convenciones ya establecidas dentro del marco, para de esta manera configurar las relaciones entre cada uno de ellos sin que nosotros tengamos que hacer nada más.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Puedes aprender más sobre como usarlos flags en la creación de modelos  en el siguiente enlace: &lt;a href="https://laravel.com/docs/8.x/eloquent#generating-model-classes"&gt;Modelos laravel&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Un ejemplo simple: cuando creamos el modelo llamado Dog, Eloquent asumirá que el nombre de la tabla será "dogs" y su clave principal es "id", por lo que lo configurará de esta manera sin que tengamos que decirle nada, de igual manera procederá a crear los archivos correspondiente a los flags que le enviemos anteponiendo el nombre del modelo, entre otras configuración según el caso (ej. En los model factories verás como agrega el modelo explícitamente como una propiedad de la clase).&lt;/p&gt;

&lt;h2&gt;
  
  
  Models Factories
&lt;/h2&gt;

&lt;p&gt;Anteriormente habíamos insertado algunos registro mediante nuestro seeder, de una forma muy fácil y agradable si sólo se necesitan unos pocos, sin embargo quedamos con la duda de ¿qué pasa con los momentos en que necesita cargar hasta 100 perros? ¿Puedes pensar en 100 nombres de perros?. Obviamente esto seria una tarea bastante larga y tediosa, y no hablemos de lo mal que queda frente a las buenas prácticas, esto agrandaría nuestro código y estaríamos repitiendo nuestras instrucciones cientos de veces. Podríamos pensar en la implementación de un bucle con la intención de reutilizar nuestra sentencia de creación, esto nos ahorraría muchas lineas de código, sin embargo, no nos quita el problema de los nombres de nuestros amigos caninos, quienes pasarían a llamarse "Qswdcg" o algo por el estilo, por lo que necesitamos una solución que sea más eficiente y consistente, esta solución son los &lt;code&gt;Model factories&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A partir de la última versión de Laravel (v8.0), la forma de trabajar de las &lt;code&gt;factories&lt;/code&gt; ha cambiado, así que toma en cuenta que lo que te explicaré acá no será compatible con versiones anteriores, a menos que hagas las respectivas adaptaciones. Si quieres saber mas sobre que cambió puedes revisar el siguiente link: &lt;a href="https://laravel.com/docs/8.x/upgrade#model-factories"&gt;Actualizar model factories&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Los models factories son clases php con la responsabilidad de crear instancias de nuestro objetos con información ya precargada según la configuración que le demos. La verdad son bastante potentes y en esta ultima versión le han sido añadido un gran cantidad de recursos bastante útiles que agilizan y facilitan el desarrollo de nuestras aplicaciones.&lt;/p&gt;

&lt;p&gt;Vayamos a nuestro directorio &lt;code&gt;database/factories/&lt;/code&gt;, y encontraremos un archivo llamado DogFactory. Echemos un vistazo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;    &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DogFactory&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Factory&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="cd"&gt;/**
        * The name of the factory's corresponding model.
        *
        * @var string
        */&lt;/span&gt;
        &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nv"&gt;$model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="cd"&gt;/**
        * Define the model's default state.
        *
        * @return array
        */&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;definition&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="c1"&gt;//&lt;/span&gt;
            &lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vemos que nuestra clase solo tiene una propiedad y un método. La propiedad model tiene asignada el modelo con el cual se relaciona, como hemos creado nuestro modelo con el flag correspondiente (-f), esta asignación la hace Laravel por defecto, de no haberla pasado deberíamos hacerlo nosotros manualmente. Con respecto al método &lt;code&gt;definition&lt;/code&gt;, este retorna un array el cual contendrá un par clave-valor, siendo la clave el nombre de nuestros campos asignados en la base de datos, y el valor puede ser lo que queramos que contenga nuestro modelo en dicho atributo cuando creamos una instancia a través de este factory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;definition&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Jackie'&lt;/span&gt;
        &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En el ejemplo que acabo de colocar es necesario hacer varias aclaratorias:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Solo he colocado &lt;code&gt;name&lt;/code&gt; pues es el único campo que hemos agregado en nuestra migración, a pesar de que en nuestra base de datos existen un par de campos más (created_at y updated_at), no es necesarios que los agregue acá puesto que eloquent se encarga de gestionarlos automáticamente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Aunque he añadido una cadena, eso no impedirá que cuando ejecute el seeder, los nombres que yo haya asignado cuando creo una instancia de Dog mediante factory (ver fig. 1)  sean asignado.&lt;br&gt;
(ej. Puedo ejecutar Dog::factory()-&amp;gt;create(['name' =&amp;gt; 'Jock']); y el registro se guardará como Jock y no como Jackie, pues estoy sobrescribiendo la configuración dada.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Si! seguimos teniendo el problema de crear muchos registros, puesto que todos se llamarán Jackie, pero no te apresures, fue intencional por motivos ilustrativos.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;¿Como podemos hacer entonces para que nuestros amigos tengan todos nombres distintos? Pues aquí entra el segundo elemento de nuestra lista Faker, recurso bastante interesante que nos ayudará a poblar nuestra base de datos de una manera consistente y dinámica.&lt;/p&gt;

&lt;h2&gt;
  
  
  Faker
&lt;/h2&gt;

&lt;p&gt;Faker es una biblioteca maravillosa que nos dará datos falsos pero realistas que podremos sembrar.&lt;/p&gt;

&lt;p&gt;Hagamos una fábrica para perros y luego veamos cómo usarla en nuestro seeder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;definition&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;faker&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;firstName&lt;/span&gt;
        &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;y ahora en nuestro seeder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Dog&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Acá le estamos indicando a nuestro seeder que pueble nuestra base de datos con 10 registros, por lo que procederá a registrar 10 perros en nuestra tabla &lt;code&gt;dogs&lt;/code&gt;, verás como cada uno tiene su propio nombre, y además ese nombre es perfectamente legible y pronunciable (si, se que siguen siendo algunos nombre raros para unos perros...bueno todos, pero es mejor que llamarlos “Jsdhak”).&lt;/p&gt;

&lt;p&gt;Puedes migrar y sembrar las veces que quieras (recuerda las buenas prácticas que hemos aprendido) y jugar con la cantidad de registros, notarás como siempre los nombres son distintos para cada uno de tus caninos.&lt;/p&gt;

&lt;p&gt;Hay un último consejo que aprender antes de terminar por hoy que nos ahorrará tener que recordar y escribir todo ese comando cuando sembramos nuestros registros de perros. Hasta ahora siempre hemos ejecutado nuestro comando sembrador pasando el nombre del seeder a ejecutar, esto lo podemos cambiar si hacemos una pequeña configuración que nos facilitará aun más las cosas.&lt;/p&gt;

&lt;p&gt;Vamos al directorio &lt;code&gt;database/seeds/&lt;/code&gt; y abrimos el archivo &lt;code&gt;DatabaseSeeder.php&lt;/code&gt;,  esta es de alguna forma una clase madre en la que podemos llamar de manera individual todos y cada uno de nuestro seeders, por ahora solo tenemos uno, pero cuando nos toque trabajar con aplicaciones más grandes, agradeceremos por la existencia de este gran elemento.&lt;/p&gt;

&lt;p&gt;Como ya hemos abierto el archivo, procedamos entonces a agregar nuestro &lt;code&gt;DogSeeder&lt;/code&gt; para que su clase madre, al ser llamada, ejecute todo lo que en ella este contenida:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;DogsTableSeeder&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El método run debe verse como en el código anterior, con esto ya hemos añadido nuestro seeder, de ahora en adelante, cada vez que queramos que nuestros seeders se ejecuten por lote, los agregaremos  acá,y eso será todo, podremos recrear toda nuestra base de datos con datos de semillas con un comando simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;    &lt;span class="n"&gt;php&lt;/span&gt; &lt;span class="n"&gt;artisan&lt;/span&gt; &lt;span class="n"&gt;migrate&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;refresh&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;seed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hasta ahora llevamos dos lección y  todavía apenas hemos tocado Eloquent!. No te preocupes que eso va a cambiar a partir de la próxima entrega, pero era necesario aprender lo que hasta ahora hemos visto, pues nos facilitará enormemente la vida ayudándonos a crear un entorno de desarrollo de forma rápida y sencilla ahorrándonos mucho tiempo y frustración a medida que creamos nuestro proyecto.&lt;/p&gt;

&lt;p&gt;Puedes ampliar mucho mas revisando la documentación oficial de Laravel, te invito a que de verdad le des una ojeada, pues facilitará mucho tu curva de aprendizaje.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://laravel.com/docs/8.x/database-testing#introduction"&gt;Seeders&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://laravel.com/docs/8.x/database-testing#defining-model-factories"&gt;Factories&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/FakerPHP/Faker"&gt;Faker&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Quédate atento a la próxima entrega, si tienes alguna duda puedes contactarme en mi cuenta de Twitter &lt;a class="mentioned-user" href="https://dev.to/johantovar"&gt;@johantovar&lt;/a&gt;
 o déjala en los comentarios. Hasta entonces y que tengas un feliz y exitoso día.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>eloquent</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Aprende eloquent con ejemplos!!!</title>
      <dc:creator>Johan Tovar</dc:creator>
      <pubDate>Sun, 11 Apr 2021 20:52:46 +0000</pubDate>
      <link>https://dev.to/johantovar/aprende-eloquent-con-ejemplos-2ld7</link>
      <guid>https://dev.to/johantovar/aprende-eloquent-con-ejemplos-2ld7</guid>
      <description>&lt;p&gt;&lt;em&gt;Una serie de artículos basados e inspirados en el curso &lt;a href="https://eloquentbyexample.com/"&gt;EloquentbyExample&lt;/a&gt; del desarrollador Jeff Madsen(&lt;a class="mentioned-user" href="https://dev.to/codebyjeff"&gt;@codebyjeff&lt;/a&gt;
), dirigidos a ilustrar el uso de eloquent, famoso ORM usado por laravel para la interacción con bases de datos.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Bienvenidos a este nuevo proyecto que inicio con muchas ganas y entusiasmo, siempre he querido retribuir de alguna manera el conocimiento que he adquirido en la red, a través de publicaciones, cursos, tutoriales y un sin fin de material que, con el ánimo solo de compartir, transmitir y nutrir a la comunidad de desarrolladores, muchos de sus integrantes han elaborado de manera desinteresada, por lo que me siento orgulloso hoy día de unirme a ellos con este pequeño pero importante aporte.&lt;/p&gt;

&lt;p&gt;Antes de entrar de lleno con el contenido que pretendo desarrollar a lo largo de esta serie de publicaciones, quiero dar un agradecimiento y un reconocimiento a Jeff Madsen, por haberme permitido tomar su curso &lt;a href="https://eloquentbyexample.com/"&gt;EloquentbyExample&lt;/a&gt; como base para la elaboración del contenido de este proyecto, pues fue este curso el detonante que necesité para atreverme a dar este paso. Gracias Jeff!!!&lt;/p&gt;

&lt;p&gt;Pues bien, hechos los respectivos agradecimientos y las aclaraciones pertinentes, entremos en materia y demos comienzo a este pequeño curso.&lt;/p&gt;

&lt;p&gt;Empecemos por dar un poco de contexto, diciendo que tenemos una aplicación para un centro veterinario en el que necesitamos registrar todos los caninos que ingresan, para esto, nuestro jefe nos ha indicado agregar un módulo "dogs" (aunque el curso es una adaptación al español, es mejor mantener las buenas prácticas de codificar en inglés), por lo que tendremos que configurar la base de datos y dejar todo listo para lo que se construirá más adelante. Debemos comenzar por crear la tabla de una manera que se pueda agregar fácilmente a los servidores locales y compartidos de los otros desarrolladores, así como al modelo eloquent.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Nota: Laravel viene con una configuración para la base de datos ya predefinida que no debería darte problemas, sin embargo te dejo el enlace por si necesitas hacer alguna configuración adicional &lt;a href="https://laravel.com/docs/8.x/database#configuration"&gt;Database: Getting Started - Laravel&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Migraciones:
&lt;/h2&gt;

&lt;p&gt;El primer paso que debemos dar en laravel para crear nuestra tabla es crear una migración, para lo cual ejecutaremos un simple comando en nuestra consola: &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan make:migration create_dogs_table
~~~

Simple ¿verdad?. Este sencillo comando nos genera un archivo en la ruta */database/migrations*, si vamos ahí encontraremos un total de cuatro archivos, tres de ellos ya vienen con laravel por defecto, el cuarto es el archivo que hemos creado.

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c2oh1j6392tfrpstqvfq.png)

Así de fácil hemos creado nuestra primera migración, pasemos ahora a abrir el archivo, veremos que en realidad trae muy poco, apenas un par de funciones, `up()` y `down()`, totalmente vacías, y si revisamos nuestra base de datos, no tenemos nada!!!

Hasta ahora lo único que hemos hecho es crear un archivo de “andamiaje básico” para contener la información que se convertirá en una declaración `CREATE TABLE`, con un comando separado pero similar, llamado `migrate`. Ahora bien, cuando los desarrolladores comenzamos a trabajar con migraciones, no tenemos una noción clara sobre estas diferencias, por lo que terminamos "arreglando" un montón de cosas manualmente, haciendo un total desastre.

Es importante que tengamos claro que este archivo mantendrá nuestra información de creación de tablas, por lo que podemos hacer los cambios que queramos, incluso borrarlos, sin consecuencias, mientras no ejecutemos el comando real `php artisan migrate`, encargado de recorrer todos los archivos *migrations* y crear así nuestras tablas.

Entendido lo anterior, vamos ahora a crear nuestra migración como es debido, así que, eliminemos el archivo para que podamos hacer una mejor versión y ejecutemos el siguiente comando:



```php
php artisan make:migration create_dogs_table --create=dogs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si te fijas hemos agregado &lt;code&gt;--create=dogs&lt;/code&gt;, ahora en nuestro archivo, encontraremos que se han agregado algunas líneas más de código, aportan utilidad a las funciones &lt;code&gt;up()&lt;/code&gt; y &lt;code&gt;down()&lt;/code&gt;. En la primera de estas creamos nuestra tabla, con la segunda revertimos la instrucción anterior. Agreguemos entonces un campo a nuestra migración, de tal manera que nuestro archivo se verá así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nf"&gt;up&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'dogs'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Blueprint&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt;       &lt;/span&gt; &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;timestamps&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="err"&gt;    &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nf"&gt;down&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dropIfExists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'dogs'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ejecutemos ahora el comando &lt;code&gt;php artisan migrate&lt;/code&gt;, y busquemos ahora en nuestra base de datos, encontraremos que se han creado las tablas correspondientes.&lt;/p&gt;

&lt;p&gt;Hasta ahora no hemos ahondado en el tema de las migraciones, pues el desarrollo completo de este particular escapa del ámbito de lo que se pretende plasmar en el curso, pero si quieres profundizar más sobre el tema te invito a revisar &lt;a href="https://laravel.com/docs/8.x/migrations"&gt;la documentación de laravel&lt;/a&gt;, quizás en otra oportunidad haga una serie dedicada solo al tema de las migraciones, pero, por lo pronto, quedémonos con lo explicado y veamos algunas cosas importantes antes de pasar a la siguiente tarea.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Borrar el archivo migration no afecta nuestra tabla de manera directa, por ende, no implica que se borre nuestra tabla.&lt;/li&gt;
&lt;li&gt;Al crear el archivo migration puedes asignarle cualquier nombre al flag &lt;code&gt;--create&lt;/code&gt;, pero es una convención establecida (y recomendada) que se escriba en minúscula y en plural (salvo algunas excepciones como tablas pivote).&lt;/li&gt;
&lt;li&gt;Se recomienda el uso de &lt;code&gt;php artisan migrate:rollback&lt;/code&gt; si necesitas devolver una ejecución previa de &lt;code&gt;migrate&lt;/code&gt;. También puedes usar &lt;code&gt;php artisan migrate:refresh&lt;/code&gt; para reiniciar tu base de datos.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Seeders
&lt;/h2&gt;

&lt;p&gt;Pasemos ahora a nuestra siguiente tarea, necesitamos trabajar con datos limpios y sin duplicados, pues esto facilitará, entre otros aspectos, a la detección de errores.&lt;/p&gt;

&lt;p&gt;La respuesta a esto es &lt;strong&gt;Seeders&lt;/strong&gt; - un conjunto especial de clases que nos permiten rellenar nuestra base de datos una y otra vez con los mismos datos exactos.&lt;/p&gt;

&lt;p&gt;Vamos a aprender en la próxima entrega cómo hacer algunos sembradores realmente poderosos para producir grandes datos de desarrollo y pruebas, pero hoy ya se está haciendo un poco largo, así que vamos a presentar la idea. Un "&lt;strong&gt;Seeders&lt;/strong&gt;" es simplemente una clase que rellena la base de datos con su información respectiva. Lo bueno de ellos es que puedes usar una instrucción de línea de comandos simple para actualizar los datos, por lo que después de haber estado trabajando durante un tiempo puedes limpiarlo y empezar de nuevo. También te permite evitar nombres como "&lt;em&gt;assdffggggg&lt;/em&gt;" y otros datos sucios que pueden causar algún bug.&lt;/p&gt;

&lt;p&gt;Vayamos a la línea de comandos y escribamos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;artisan&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;make&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;seeder&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nc"&gt;DogsTableSeeder&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este comando creará un archivo en &lt;code&gt;/database/seeders&lt;/code&gt;, vamos ahí y abramos el archivo, veremos una clase muy simple con un único método llamado &lt;code&gt;run()&lt;/code&gt;. No hay nada mágico en esta clase, es realmente poco más que un envoltorio alrededor de una clase de comando de consola, hecho específicamente para ayudar con esta tarea en particular. Vamos a comprobarlo  nosotros mismos añadiendo lo siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Sembrando datos!'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;y luego de vuelta a la línea de comandos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;artisan&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;DogsTableSeeder&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Está llamando desde la facade &lt;code&gt;DB&lt;/code&gt;, pero no hay ninguna interacción real de la base de datos aquí. Vamos a poblar la tabla ahora con un par de perros:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="err"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt;        &lt;/span&gt;&lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'dogs'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Joe'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="err"&gt;        &lt;/span&gt;&lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'dogs'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Jock'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="err"&gt;        &lt;/span&gt;&lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'dogs'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Jackie'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="err"&gt;        &lt;/span&gt;&lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'dogs'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Jane'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="err"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora ejecutemos de nuevo &lt;code&gt;php artisan db:seed --class=DogsTableSeeder&lt;/code&gt;, verás que nuestra tabla tendrá cuatro caninos dentro de sus registros.&lt;/p&gt;

&lt;p&gt;Si nos fijamos bien, trabajando de esta manera podremos eliminar, agregar y/o editar nuestros perros mientras trabajamos, y luego con un simple comando restablecerlos a un estado inicial, sin embargo, hay algunas mejoras que podemos hacerle a este código, una de ellas es que, de la forma que lo hemos planteado, debemos ser nosotros quienes elegimos los nombres, algo que se hace fácil si solo son unos pocos registros, pero, si nos toca hacerlo con unos 500 perros la tarea no se hace tan divertida ¿cierto?.&lt;/p&gt;

&lt;p&gt;Por otra parte imaginemos ¿qué pasaría si tenemos otra lógica que queremos que suceda en el tiempo de creación del registro de perros?. Aquí estamos insertando directamente el nombre en la tabla, pero realmente queremos usar el ORM eloquent que viene con Laravel, al fin y al cabo es lo que vinimos a aprender, pues bien, en la próxima entrega veremos ésta y otras mejoras que de seguro harán nuestro trabajo más fácil, por ahora te invito a que le eches un ojo a la &lt;a href="https://laravel.com/docs/8.x/seeding"&gt;documentación oficial sobre los seeders&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Quédate atento a la próxima entrega, si tienes alguna duda puedes contactarme en mi cuenta de twitter &lt;a href="https://twitter.com/JohanTovar"&gt;@JohanTovar&lt;/a&gt; o déjala en los comentarios. Hasta entonces y que tengas un feliz y exitoso día.&lt;/p&gt;

</description>
      <category>php</category>
      <category>laravel</category>
      <category>tutorial</category>
      <category>eloquent</category>
    </item>
  </channel>
</rss>
