<?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: JulioDotCom</title>
    <description>The latest articles on DEV Community by JulioDotCom (@juliodotcom).</description>
    <link>https://dev.to/juliodotcom</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%2F314021%2Fe0de19d6-907e-4c0c-b110-38460132e420.jpg</url>
      <title>DEV Community: JulioDotCom</title>
      <link>https://dev.to/juliodotcom</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/juliodotcom"/>
    <language>en</language>
    <item>
      <title>Filtros de búsqueda en Laravel-Livewire</title>
      <dc:creator>JulioDotCom</dc:creator>
      <pubDate>Wed, 04 Aug 2021 21:08:08 +0000</pubDate>
      <link>https://dev.to/juliodotcom/filtros-de-busqueda-en-laravel-livewire-5ckn</link>
      <guid>https://dev.to/juliodotcom/filtros-de-busqueda-en-laravel-livewire-5ckn</guid>
      <description>&lt;p&gt;Una de las principales características que el usuario requiere cuando trabajamos con tablas es el filtrado de información en tiempo real.&lt;br&gt;
En este post te enseñaré a crear diferentes filtros de búsqueda con el dinamismo que nos provee &lt;a href="https://laravel-livewire.com/" rel="noopener noreferrer"&gt;Laravel-Livewire&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalación.
&lt;/h2&gt;

&lt;p&gt;No nos detendremos a explicar la instalación de este framework es de lo mas sencillo; basta con seguir al pie de la letra la &lt;a href="https://laravel-livewire.com/docs/2.x/installation" rel="noopener noreferrer"&gt;documentación oficial&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Universo del discurso.
&lt;/h2&gt;

&lt;p&gt;Se tiene una pequeña app de películas que fueron dirigidas por uno o más directores de cine, lo que buscamos es mostrar la información de cada uno de las películas así como la de los directores de cine con &lt;strong&gt;filtros de búsqueda.&lt;/strong&gt;&lt;br&gt;
Para las películas los filtros necesarios son: Nombre de película y fecha de estreno.&lt;br&gt;
Para los directores de cine los filtros necesarios son: Nombre del director.&lt;/p&gt;

&lt;h2&gt;
  
  
  Manos a la obra.
&lt;/h2&gt;

&lt;p&gt;Una vez entendido la situación a resolver empecemos a codificar.&lt;br&gt;
Comenzaremos creando la estructura de la base de datos que podría lucir como la siguiente.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

movies
    id - integer
    title- string 
    premiere - date

directors
    id - integer
    name - string

director_movie
    id - integer
    director_id - integer    
    movie_id - integer


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

&lt;/div&gt;

&lt;p&gt;Después crearemos modelos para cada entidad y agregaremos nuestras relaciones.&lt;br&gt;
Modelo Director.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&amp;lt;?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Director extends Model
{
    use HasFactory;

    protected $fillable = [
        'name',
    ];
    /*
    * Relationships
    **/
    public function movies(){
        return $this-&amp;gt;belongsToMany(Movie::class);
    }
}


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

&lt;/div&gt;

&lt;p&gt;Modelo Película&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&amp;lt;?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Movie extends Model
{
    use HasFactory;

    protected $fillable = [
        'title',
        'premiere'
    ];
    /*
    * Relationships
    **/

    public function directors(){
        $this-&amp;gt;belongsToMany(Director::class);
    }
}


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

&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Nota: Para hacer el seed de mi base de datos estoy usando faker, posiblemente tú tengas información real así que no te preocupes por ello.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ya que modelamos nuestra base de datos podremos crear nuestro componente usando el CLI de Artisan.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

php artisan make:component IndexComponent


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

&lt;/div&gt;

&lt;p&gt;Deberá aparecer este nuevo componente en nuestra carpeta &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;App\Http\Livewire\IndexComponent.php&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dentro del componente encontraremos el método render que mostrará el template de nuestro componente.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&amp;lt;?php

namespace App\Http\Livewire;

use Livewire\Component;

class IndexComponent extends Component
{
    public function render()
    {
        return view('livewire.index-component');
    }
}


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

&lt;/div&gt;

&lt;p&gt;En esta vista es donde crearemos nuestra tabla para mostrar la información.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


&amp;lt;div&amp;gt;
    &amp;lt;div class="table-responsive"&amp;gt;
        &amp;lt;table class="table"&amp;gt;
            &amp;lt;thead&amp;gt;
            &amp;lt;th&amp;gt;Nombre de película&amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;Premiere&amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;Director&amp;lt;/th&amp;gt;
            &amp;lt;/thead&amp;gt;
            &amp;lt;tbody&amp;gt;

            &amp;lt;/tbody&amp;gt;
        &amp;lt;/table&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;


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

&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Nota: Es imperativo contar con un div padre para todo componente de lo contrario encontraremos errores.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Antes de continuar tengo que platicarte que &lt;a href="https://laravel-livewire.com/" rel="noopener noreferrer"&gt;Livewire&lt;/a&gt; nos brinda una API de acceso a propiedades dinámicas, especialmente para obtener información que se encuentra almacenada en una base de datos, esto se resume en las &lt;a href="https://laravel-livewire.com/docs/2.x/properties" rel="noopener noreferrer"&gt;Computed Properties&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para crear una &lt;a href="https://laravel-livewire.com/docs/2.x/properties" rel="noopener noreferrer"&gt;computed property&lt;/a&gt; es necesario crear un método que nos de acceso a ella y para lograrlo utilizaremos la siguiente nomenclatura&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

Utilizando el sufijo get[nuestra_propiedad]Property
public function getMoviesProperty(){
    // some magic code
}


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

&lt;/div&gt;

&lt;p&gt;siguiendo esta convención estamos listos para pasar a la parte importante de nuestro código.&lt;/p&gt;

&lt;p&gt;Bien, hasta ahora nuestro controlador del componente luce de esta forma.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&amp;lt;?php

namespace App\Http\Livewire;

use Livewire\Component;

class IndexComponent extends Component
{

    public function getMoviesProperty(){
        //Some magic code.
    }


    public function render()
    {
        return view('livewire.index-component');
    }
}


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

&lt;/div&gt;

&lt;p&gt;Es necesario crear nuestros filtros para realizar la búsqueda, en lo personal a mi me gusta abstraerlos en un array asociativo, déjame mostrarte como:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&amp;lt;?php

namespace App\Http\Livewire;

use Livewire\Component;

class IndexComponent extends Component
{

    public $filters = [
        'movie_title' =&amp;gt; '',
        'premiere' =&amp;gt; '',
        'director_name' =&amp;gt; '',
    ];
...


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

&lt;/div&gt;

&lt;p&gt;De está manera abstraemos todos los filtros en un solo array para realizar el &lt;a href="https://laravel-livewire.com/docs/2.x/properties#data-binding" rel="noopener noreferrer"&gt;binding&lt;/a&gt; de nuestro array de filtros para esto también es necesario agregar los inputs en nuestro template.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6oanejjfi85r4du960ld.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6oanejjfi85r4du960ld.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora a mostrar los datos del controlador del componente usando nuestra &lt;a href="https://laravel-livewire.com/docs/2.x/properties" rel="noopener noreferrer"&gt;computed property&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F22fp5vs0kovoxv9ita65.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F22fp5vs0kovoxv9ita65.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Permíteme explicarte línea por línea la idea del primer filtro que estamos haciendo.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Indicamos que se hará un query al modelo Movie.&lt;/li&gt;
&lt;li&gt;Haciendo uso de las &lt;a href="https://laravel.com/docs/8.x/queries#conditional-clauses" rel="noopener noreferrer"&gt;clausulas condicionales&lt;/a&gt; del query builder de Laravel el modelo entenderá cuando será necesario retornar alguna otra sentencia, es decir, cuando no se encuentre vacío el valor del índice movie_title retornará la sentencia where que se encuentra dentro de la &lt;a href="https://www.php.net/manual/en/functions.anonymous.php" rel="noopener noreferrer"&gt;función anónima&lt;/a&gt; del método when; de lo contrario saltará a la siguiente instrucción.&lt;/li&gt;
&lt;li&gt;Agregamos el método &lt;a href="https://laravel.com/docs/8.x/eloquent-relationships#eager-loading" rel="noopener noreferrer"&gt;with&lt;/a&gt; para evitar hacer demasiadas peticiones al servidor en las relaciones.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ya que entendimos el flujo de información entre la vista del componente y el controlador del componente podremos realizar los demás filtros.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F577boj5gnk5tmiymrh9o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F577boj5gnk5tmiymrh9o.png" alt="image"&gt;&lt;/a&gt;&lt;br&gt;
Ahora bien; permíteme explicarte el funcionamiento del ultimo filtro que contiene la relación M:N de nuestra base de datos.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cuando no se encuentre vacío el valor del índice director_name retornara lo que se tenga dentro de la función anónima del método, así mismo haremos una unión entre las tablas con el método &lt;a href="https://laravel.com/docs/8.x/eloquent-relationships#querying-relationship-existence" rel="noopener noreferrer"&gt;whereHas&lt;/a&gt; de esta manera podremos filtrar de manera correcta el nombre del director.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Mostrando los datos
&lt;/h2&gt;

&lt;p&gt;Finalmente solo queda mostrar los datos en la vista del componente de la siguiente manera.   &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsphtk2mhwtax6kwqj0vu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsphtk2mhwtax6kwqj0vu.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Es tu turno.
&lt;/h2&gt;

&lt;p&gt;Hasta aquí hemos terminado el tutorial de como realizar los filtros de información en tiempo real, solo queda probarlo en tu maquina local y verás la magia.&lt;br&gt;
Happy codding! &lt;/p&gt;

</description>
      <category>laravel</category>
      <category>livewire</category>
      <category>php</category>
      <category>eloquent</category>
    </item>
    <item>
      <title>How to create a PHP validator.</title>
      <dc:creator>JulioDotCom</dc:creator>
      <pubDate>Wed, 09 Jun 2021 08:56:43 +0000</pubDate>
      <link>https://dev.to/juliodotcom/how-to-create-a-php-validator-3m5</link>
      <guid>https://dev.to/juliodotcom/how-to-create-a-php-validator-3m5</guid>
      <description>&lt;p&gt;Ok…&lt;br&gt;
When i started with web development the first language i touched was PHP, i started creating simple form data inputs with some fields like:&lt;br&gt;
*Name&lt;br&gt;
*Email&lt;br&gt;
*Phone number&lt;br&gt;
etc.&lt;br&gt;
And yes, they “work” but what happens when the users give us wrong data? and we dont want to use HTML’s validation tags because they are unsafe.&lt;br&gt;
So i’ve decided to create my own Validator (no, not like Laravel validator).&lt;/p&gt;

&lt;h1&gt;
  
  
  So… lets start.
&lt;/h1&gt;

&lt;p&gt;For this you must know the basics of:&lt;br&gt;
*OOP&lt;br&gt;
*PHP 7.x&lt;br&gt;
First of all we need a basic form with some fields (create your own or just copy it from below).&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftnh3cg20r8i82lrzbwgl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftnh3cg20r8i82lrzbwgl.png" alt="Alt Text" width="" height=""&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmdc6volzfcp0tmms5jqr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmdc6volzfcp0tmms5jqr.png" alt="Alt Text" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Let’s create our class helper Validator.php
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx9zp4dgcr2kgvm8aogs6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx9zp4dgcr2kgvm8aogs6.png" alt="Alt Text" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nice! so let’s work on our someAction.php file.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxjm7ns9fa9l3uf8s9gxf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxjm7ns9fa9l3uf8s9gxf.png" alt="Alt Text" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Great! we only need to display those errors on login.php file adding some php script.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2pgycbijfp39dihmp1s2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2pgycbijfp39dihmp1s2.png" alt="Alt Text" width="" height=""&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdpjf4zrpsb3d3rlskzv8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdpjf4zrpsb3d3rlskzv8.png" alt="Alt Text" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And thats how we created our own validator in PHP.&lt;br&gt;
Happy coding!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>php</category>
      <category>oop</category>
    </item>
    <item>
      <title>Contra reloj</title>
      <dc:creator>JulioDotCom</dc:creator>
      <pubDate>Sat, 11 Apr 2020 01:13:04 +0000</pubDate>
      <link>https://dev.to/juliodotcom/contra-reloj-50pe</link>
      <guid>https://dev.to/juliodotcom/contra-reloj-50pe</guid>
      <description>&lt;p&gt;¡La entrega de maquetado es la siguiente semana! ¡hurry up!&lt;/p&gt;

</description>
      <category>fromhome</category>
    </item>
    <item>
      <title>Cuarentena</title>
      <dc:creator>JulioDotCom</dc:creator>
      <pubDate>Tue, 31 Mar 2020 07:17:08 +0000</pubDate>
      <link>https://dev.to/juliodotcom/cuarentena-2k88</link>
      <guid>https://dev.to/juliodotcom/cuarentena-2k88</guid>
      <description>&lt;p&gt;Viendo el lado positivo de esta cuarentena me doy cuenta que tengo tiempo de estudiar para mi examen de maestría.&lt;/p&gt;

&lt;p&gt;¡UAM ahí te voy!&lt;/p&gt;

</description>
      <category>fromhome</category>
    </item>
    <item>
      <title>Cuarentena</title>
      <dc:creator>JulioDotCom</dc:creator>
      <pubDate>Sat, 28 Mar 2020 20:45:31 +0000</pubDate>
      <link>https://dev.to/juliodotcom/cuarentena-4m00</link>
      <guid>https://dev.to/juliodotcom/cuarentena-4m00</guid>
      <description>&lt;p&gt;Creí que trabajar desde casa seria una buena opción pero llega un momento en el que te aburres de tirar código y leer. ¡Necesito hacer ejercicio!&lt;/p&gt;

</description>
      <category>fromhome</category>
    </item>
  </channel>
</rss>
