Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Web Apps
Code

Usando Illuminate Database com Eloquent em Seu App PHP sem Laravel

by
Difficulty:IntermediateLength:LongLanguages:

Portuguese (Português) translation by Erick Patrick (you can also view the original English article)

Illuminte é o motor da base de dados do Laravel sem o Laravel. Ele vem junto do Eloquent ORM no Laravel. Se gostamos de criar apps em PHP com ORMs e não queremos usar Laravel, esse tutorial vai ajudar.

Nele, criaremos o backend de um app de perguntas e respostas com PHP, Illuminate Database e o Eloquent ORM.

Dependências do Projeto

  1. PHP: 5.5+
  2. MYSQL
  3. Composer

Capacidades do App

Nosso app realiza dez tarefas:

  • Adicionar um usuário
  • Adicionar uma pergunta
  • Adicionar resposta de uma pergunta
  • Votar favoravelmente uma resposta
  • Obter uma pergunta com respostas
  • Obter todas as perguntas e usuários que as perguntaram
  • Obter perguntas específicas, respostas e votos favoráveis
  • Contar perguntas de um usuário em particular
  • Atualizar resposta de um usuário
  • Remover uma pergunta

Primeiro, criaremos a pasta e estrutura do projeto.

Na pasta principal do projeto, criaremos a pasta app e dentro dela, criaremos duas outras: models e controllers. Na figura abaixo, a pasta principal é chamada de eloquent. Podemos alterá-lo para o nome que preferirmos.

Our project organization

Depois, criemos index.php na pasta principal, no mesmo nível da pasta app.

Usaremos git, então criemos o arquivo .gitignore. Esse passo é opcional.

Depois, instalemos as dependências necessárias para o projeto funcionar. Na raiz do projeto, criaremos composer.json e colaremos o código abaixo nele.

Para instalar a base de dados Illuminate, adicionamos isso ao composer.json:
“illuminate/database”: “5.1.8”,.

Depois, adicionamos o auto-carregamento PSR-4 dos Modelos e Controladores:

Agora, o composer.json deve parecer com isso:

Executaremos esses dois comandos na mesma pasta do composer.json:

Eles gerarão uma pasta vendor que adicionaremos ao gitignore (também é opcional).

Criemos a configuração com as credenciais da base de dados.

Na pasta raiz, criemos config.php e definamos os detalhes do banco em config.php. Notemos que os valores devem ser substituídos pelos detalhes reais de conexão.

Depis, criaremos o esquema do app.

Algo a notar antes de criarmos os esquemas das tabelas na base de dados é que podemos adicionar marcas de hora neles.

O Eloquent ORM espera por duas colunas de marcas de hora se habilitarmos a operação de marca de hora em um modelo/tabela. São as colunas created_at e updated_at. Se habilitarmos essa funcionalidade, o Eloquente atualizará esses campos automaticamente com o horário de criação ou atualização.

Há uma terceira coluna, deleted_at. Esse campo de marca de hora funciona diferente. Eloquente pode "desabilitar" um registro, usando a coluna deleted_at para determinar quando ele foi desabilitado. Se removermos um registro com a função 'delete' do eloquente e usarmos essa funcionalidade, a coluna é atualizada com o horário da remoção. Então eles podem ser obtidos a qualquer hora.

Nesse app, lançaremos mão das marcas de hora, então usaremos todo os três campos na criação do esquema.

Criemos as tabelas com os comandos MySQL a seguir:

Perguntas

Respostas

Votos Favoráveis

Usuários

Continuaremos criando os arquivos dos modelos e controladores para nossas tabelas nos seguintes locais:

  • project_folder/app/models/question.php
  • project_folder/app/models/answer.php
  • project_folder/app/models/upvote.php
  • project_folder/app/models/user.php
  • project_folder/app/models/database.php
  • project_folder/app/controllers/questions.php
  • project_folder/app/controllers/answers.php
  • project_folder/app/controllers/upvotes.php
  • project_folder/app/controllers/users.php

Abramos models/database.php em um editor.

Primeiro criemos a Capsula:

No arquivo acima, inicializamos e configuramos a capsula com as constantes definidas em config.php e iniciamos o Eloquente.

O próximo passo é criar o script de inicialização. É o arquivo onde tudo tem de executar antes do app rodar.

Criamos esse arquivo em project_folder/start.php e então requeremos o arquivo auto-carregador do Composer:

require ‘vendor/autoload.php’;

Depois, requeremos config.php e obtemos as credenciais definidas: require 'config.php';.

Então inicializamos a classe da base de dados.

Nosso start.php deve parecer com isso:

Incluamos o start.php em index.php já que este será o principal.

Nosso index.php parece com isso:

Depois, começamos a trabalhar nos controladores e modelos. Em project_folder/app/models/question.php adicionamos:

Então em project_folder/app/controllers/questions.php:

Em project_folder/app/controllers/answers.php, fazemos o mesmo:

Tarefa 1: Adicionar um Usuário

No modelo do usuário (project_folder/app/models/user.php), adicionamos o código baixo para definir nosso espaço de nome, estendemos o Modelo Eloquent e definimos o nome da tabela (protected $table) e quais campos da tabela são preenchíveis em criação em massa (protected $fillable).

No controlador dos usuários (project_folder/app/controllers/user.php), definimos o nome de espaço e classe, como de costume.

Para criamos o usuário, no controlador do usuário importaremos o modelo do usuário, use Models\User;, e adicionaremos uma função para criar um usuário.

Nosso controlador de usuário parece com isso agora.

Então, no index.php, adicionamos essa linhas e executamos o app para criar um novo usuário.

Tarefa 2: Adicionar uma Pergunta

Para adicionar uma pergunta, importamos o modelo Question no controlador das questões e criamos a função create_function:

use Models\Question;

Então:

Usamos a criação em massa do Eloquent para criar registros, mas, antes de funcionar, precisamos permitir que os campos sejam preenchíveis, porque os modelos do Eloquent protegem contra criação em massa por padrão.

Então, vamos ao modelo question e adicionamos a propriedade protected $fillable à classe.

protected $fillable = ['questions', 'user_id'];

Para executar isso, importemos o controlador de perguntas no index.php e invoquemos create_question estaticamente:

use Controllers\Question;

Para criar uma pergunta com uma pergunta e id de usuário como parâmetros:

$question = Questions::create_question('Have you ever met your doppelganger?', 1);

Isso retorna um objeto modelo se bem sucedido.

Agora executaremos index.php com valores diferentes para adicionar mais perguntas à base de dados.

Tarefa 3: Adicionar uma Resposta a uma Pergunta

No modelo resposta, repetimos os passos que fizemos para pergunta e usuários, adicionando o código abaixo:

Então no controlador answers, colocamos essas linhas:

Então em index.php, criamos uma resposta para a pergunta de id 1, com usuário id 2. Não esqueçamos de importar o controlador answers no index.php.

Para prevenir múltiplos registros, comentemos todas as outras chamadas em index.php antes de executa uma nova.

Tarefa 4: Votar Favoravelmente uma Questão

São, basicamente, os mesmos passos que já usamos.

Então, colocaremos isso no modelo Upvote em project_folder/app/models/upvote.php.

Então, no controlador answers, importamos o modelo Upvote.

use Models\Upvote;

Então criamos a função upvote_answer.

Em index.php, invocamos a função com um id de usuário falso e respota de id 1.

$upvote = Answers::upvote_answer(1,14);

Tarefa 5: Obter uma Pergunta Com Respostas

Para tarefas como essa, usamos as relações do Eloquent.

Tipos de relacionamento incluem: um a um, um para muitos, muitos para muitos, etc.

Ao usar esses relacionamentos, o Eloquent assume que há a chave estrangeira no formato modelname_id nos modelos. Para essa tarefa, o relacionamento é um-para-muitos, porque uma pergunta pode ter várias respostas.

Primeiro, definamos esse relacionamento adicionando essa função ao modelo question.

Então no controlador questions, escrevemos a função de obter as perguntas com respostas.

Isso retorna as perguntas com suas respostas.

Em index.php, comentamos as outras chamadas e executamos:

$all = Questions::get_questions_with_answers();

Podemos usar var_dump ou print_r em com $all para ver o resultado.

Tarefa 6: Obter Todas Perguntas e Usuários Que as Perguntaram

Essa é uma relação um-para-um porque uma pergunta tem um usuário, então adicionemos isso ao modelo question.

Então criamos uma função no controlador questions e usemos a função with no modelo question.

Em index.php, comentemos todo o resto e executemos:

$all_with_users = Questions::get_questions_with_users();

Tarefa 7: Obter uma Pergunta Com Respostas e Votos

Primeiro, temos a relação entre perguntas e votos. Uma pergunta pode ter vários votos, então o relacionamento é um-para-muitos.

Então, adicionamos a função abaixo no modelo answer:

Então no controlador questions, criamos essa função:

Como antes, comentamos todas as outras chamadas e executamos essa:

$one_questions = Questions::get_question_answers_upvotes(1);

Podemos imprimir $one_question para ver os resultados.

Tarefa 8: Contar Todas Perguntas de um Usuário Específico

Primeiro, importamos o modelo question no controlador users:

use Models\Questions;

Então criamos essa função:

Em index.php, comentamos as outras chamadas e adicionamos:

$user_question_count = Users::question_count(1);

Isso retorna um inteiro que é o número de perguntas que foram adicionas pelo usuário de id 1.

Podemos imprimir $user_question_count e executar index.php para ver os resultados.

Tarefa 9: Atualizar Resposta de um Usuário

O conceito de atualização com Eloquent ORM é bem simples. Primeiro buscamos um registros, modificamos e salvamos.

Agora, no controlador answers, adicionamos essa função:

Em index.php, comentamos as outras chamadas e atualizamos a resposta com id 1, dessa forma:

$update_answer = Answers::update_answer(1, "This is an updated answer");

Isso retorna um booleano—true—se for bem sucedido.

Tarefa 10: Remover uma Pergunta (Desabilitar)

Na tarefa final, implementaremos o desabilitar do Eloquent.

Primeiro, dizemos ao modelo question para usar SoftDeletes importando-o e então usando a trait SoftDeletes na classe.

use Illuminate\Database\Eloquent\SoftDeletes;

Então, depois da declaração da classe, adicionamos isso:

use SoftDeletes;

Então adicionamos deleted_at à propriedade protected $dates do modelo. Esses são passos obrigatórios.

protected $dates = ['deleted_at'];

Nosso modelo question parece com isso agora:

Então criemos a função delete_question no controlador questions.

Executemos index.php:

$delete = Questions::delete_question(1);

Parabéns! Criamos um backend funcional com Illuminate e Eloquent. E não tivemos de escrever muito código para obter tudo isso.

O código desse tutorial pode ser visto no GitHub.

Conclusão

Illuminate também vem com um construtor de consultas que podemos usar para consultas ainda mais complexas e é algo que devemos experimentar em nossos apps.

A única coisa faltando no Illuminate Database puro é a migração, que é um recurso muito legal do Laravel e do Lumen, o microframework do Laravel. Devemos considerar o uso de ambos nos apps para lançar mão dos úteis recursos que vem com eles.

Encontramos mais sobre Eloquent na Documentação Oficial do Eloquente.

Referências

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.