Illuminate é o mecanismo de banco de dados do Laravel menos o Laravel. Ele vem junto com o Eloquent ORM em Laravel. Se você gostaria de construir seus aplicativos PHP com ORMs e prefere não usar o Laravel, este tutorial é para você.
Neste tutorial, vamos construir o back-end para um Q&A App com PHP, Illuminate Database e o Eloquent ORM.
Dependências do Projeto
Recursos do aplicativo
Nosso aplicativo executará as seguintes tarefas:
- adicionar um usuário
- adicione uma pergunta
- adicionar uma resposta a uma pergunta
- voto positivo em uma resposta
- obter uma pergunta com respostas
- obter todas as perguntas e usuários que as fizeram
- obter perguntas, respostas e votos positivos específicos
- contar perguntas de um determinado usuário
- atualizar resposta do usuário
- excluir uma pergunta
Primeiramente, vamos criar nosso diretório e estrutura do projeto. No restante do tutorial, presumo que eloquente é o nome do diretório raiz do nosso projeto.
No diretório principal do projeto, criaremos um aplicativo pasta e, em seguida, nesta aplicativo pasta, criaremos duas pastas: modelos e controladores. Nesta foto, nossa pasta principal do projeto é nomeada eloquente. Você deve substituí-lo por qualquer nome que preferir.
Instale a Biblioteca Eloquent
Em seguida, vamos instalar as dependências do nosso projeto. Na pasta principal do projeto, vamos criar o eloquente/composer.json Arquivo. Depois de criá-lo, cole o seguinte código em nosso eloquente/composer.json Arquivo.
{ "name": "illuminate-example/eloquent", "description": "Implementation of Database Queries with illuminate and Eloquent", "type": "project", "require": {} }
Para instalar a biblioteca de banco de dados Illuminate, vamos adicionar “illuminate/database”: “^7.30”,
para nosso eloquente/composer.json Arquivo.
Em seguida, vamos adicionar o carregamento automático PSR-4 para nossos modelos e controladores:
"autoload": { "psr-4": { "Controllers\": "app/controllers/", "Models\": "app/models/" } }
Agora, nosso eloquente/composer.json arquivo deve ficar assim:
{ "name": "illuminate-example/eloquent", "description": "Implementation of Database Queries with illuminate and Eloquent", "type": "project", "require": { "illuminate/database": "^7.30" }, "autoload": { "psr-4": { "Controllers\": "app/controllers/", "Models\": "app/models/" } } }
Por fim, vamos executar os dois comandos a seguir na raiz do diretório do nosso projeto.
$composer install $composer dump-autoload -o
Configurar tabelas de banco de dados e arquivo de configuração
Vamos adicionar um arquivo de configuração para nossas credenciais de banco de dados. No diretório principal do projeto, vamos criar um arquivo chamado eloquente/config.php e defina os detalhes do banco de dados no eloquente/config.php arquivo conforme mostrado no trecho a seguir. Observe que os valores devem ser substituídos pelos seus próprios detalhes de conexão.
Em seguida, vamos criar um esquema para nosso aplicativo.
Uma coisa a observar antes de criarmos o esquema para as tabelas em nosso banco de dados é que podemos adicionar timestamps ao nosso esquema.
O Eloquent ORM espera duas colunas de carimbo de data/hora se quisermos habilitar a operação de carimbo de data/hora em uma tabela ou modelo específico. Eles são o created_at
e updated_at
colunas. Se habilitarmos carimbos de data/hora para um modelo, o Eloquent atualizará automaticamente esses campos com a hora em que criamos ou atualizamos um registro.
Há uma terceira coluna chamada deleted_at
. o deleted_at
timestamp funciona de forma diferente, no entanto. Eloquent tem um recurso de exclusão suave que usa o deleted_at
coluna para determinar se um registro foi excluído. Se você excluir um registro com o eloquente delete
função e você ativar exclusão reversível, a coluna é atualizada com a hora da exclusão. Esses itens excluídos podem ser recuperados a qualquer momento.
Neste aplicativo, aproveitaremos os timestamps, então usaremos todos os três em nossa criação de esquema.
Vamos criar tabelas com os seguintes comandos no MySQL.
Perguntas
Vamos usar a seguinte instrução SQL para criar o questions
tabela em nosso banco de dados.
CREATE TABLE `questions` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `question` tinytext, `user_id` int(11) DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, `deleted_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Respostas
Vamos usar a seguinte instrução SQL para criar o answers
tabela em nosso banco de dados.
CREATE TABLE `answers` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `answer` tinytext, `user_id` int(11) DEFAULT NULL, `question_id` int(11) DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, `deleted_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
votos positivos
Vamos usar a seguinte instrução SQL para criar o upvotes
tabela em nosso banco de dados.
CREATE TABLE `upvotes` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `answer_id` int(11) DEFAULT NULL, `user_id` int(11) DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, `deleted_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Usuários
Vamos usar a seguinte instrução SQL para criar o users
tabela em nosso banco de dados.
CREATE TABLE `users` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `username` varchar(100) DEFAULT NULL, `email` varchar(200) DEFAULT NULL, `password` varchar(200) DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, `deleted_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Então, concluímos a configuração do banco de dados agora. Em seguida, criaremos arquivos de modelo necessários em nosso aplicativo.
Configurando modelos Eloquent
Em primeiro lugar, precisamos criar um Database
classe para configurar a conexão com o banco de dados.
o Database
Classe
Crie o eloquente/app/modelos/banco de dados.php arquivo com seu editor de texto favorito e adicione o seguinte conteúdo.
addConnection([ 'driver' => DBDRIVER, 'host' => DBHOST, 'database' => DBNAME, 'username' => DBUSER, 'password' => DBPASS, 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', ]); // Setup the Eloquent ORM… $capsule->bootEloquent(); } }
No arquivo acima, inicializamos o Capsule
classe. Em seguida, usamos o addConnection
método para criar uma nova conexão MySQL. Finalmente, usamos o bootEloquent
método para inicializar o modelo Eloquent.
o User
Modelo
Vamos criar o eloquent/app/models/User.php arquivo com o seguinte conteúdo.
o Question
Modelo
Vamos criar o eloquent/app/models/Question.php arquivo com o seguinte conteúdo.
o Answer
Modelo
Vamos criar o eloquent/app/models/Answer.php arquivo com o seguinte conteúdo.
o Upvote
Modelo
Vamos criar o eloquent/app/models/Upvote.php arquivo com o seguinte conteúdo.
E é isso para configurar classes de modelo.
Criar Arquivos do Controlador Frontal
Nesta seção, criaremos arquivos principais de bootstrap e front controller.
o bootstrap.php Arquivo
É um arquivo comum que é usado para inicializar nosso aplicativo. Vamos criar o bootstrap.php arquivo no diretório raiz do nosso aplicativo.
Também configuramos uma conexão de banco de dados instanciando o Database
classe.
o index.php Arquivo
É um front controller do nosso aplicativo, então basicamente é um ponto de entrada do nosso aplicativo.
Vamos criar o index.php arquivo na raiz do nosso aplicativo.
Na verdade, usaremos o index.php arquivo para testar todos os nossos casos de uso no restante deste artigo.
Agora, também configuramos modelos. Na próxima seção sobre wards, começaremos a testar nossos casos de uso.
Tarefa 1: Adicionar um usuário
Primeiramente, vamos criar o eloquent/app/controllers/Users.php controller com o seguinte conteúdo.
$username,'email'=>$email,'password'=>$password]); return $user; } } ?>
Na nossa Users
classe controlador, criamos o create_user
método que é usado para criar um novo usuário. Nós usamos o create
método do Eloquent
model para criar um novo usuário.
Vamos chamá-lo de nosso index.php arquivo para testá-lo, conforme mostrado no trecho a seguir. Certifique-se de criptografar a senha com segurança antes de armazená-la. Nunca é recomendado armazenar senhas de texto simples em db.
Depois de executar o index.php arquivo, ele deve criar um novo usuário no users
tabela.
Tarefa 2: adicione uma pergunta
Primeiramente, vamos criar o eloquent/app/controllers/Questions.php controller com o seguinte conteúdo.
$question,'user_id'=>$user_id]); return $question; } } ?>
Na nossa Questions
classe controlador, criamos o create_question
método que é usado para criar uma nova pergunta. Nós usamos o create
método do Eloquent
modelo para criar uma nova pergunta.
Vamos chamá-lo de nosso index.php arquivo para testá-lo, conforme mostrado no trecho a seguir.
Depois de executar o index.php arquivo, ele deve criar uma nova pergunta no questions
tabela.
Tarefa 3: adicione uma resposta a uma pergunta
Nesta seção, veremos como adicionar respostas às nossas perguntas.
Primeiramente, vamos criar o eloquent/app/controllers/Answers.php controller com o seguinte conteúdo.
$answer,'question_id'=>$question_id,'user_id'=>$user_id]); return $answer; } } ?>
Na nossa Answers
classe controlador, criamos o add_answer
método que é usado para criar uma nova resposta.
Vamos chamá-lo de nosso index.php arquivo para testá-lo, conforme mostrado no trecho a seguir.
Depois de executar o index.php arquivo, ele deve criar uma nova resposta no answers
tabela.
Tarefa 4: vote a favor de uma resposta
Isso é praticamente os mesmos passos que fizemos anteriormente.
Vamos adicionar o seguinte método no eloquent/app/controllers/Answers.php controlador.
... ... public static function upvote_answer($answer_id,$user_id) { $upvote = Upvote::create(['answer_id'=>$answer_id,'user_id'=>$user_id]); return $upvote; } ... ...
Você também precisa importar o Upvote
modelo no eloquent/app/controllers/Answers.php controller arquivo adicionando o seguinte código.
use ModelsUpvote;
Finalmente, nós o chamamos de nosso index.php arquivo para testá-lo, conforme mostrado no trecho a seguir.
Tarefa 5: obtenha uma pergunta com respostas
Para tarefas como essa, podemos usar relacionamentos Eloquent.
Tipos de relacionamentos incluem um para um, um para muitos, muitos para muitos, etc.
Ao usar essas relações, o Eloquent assume uma chave estrangeira na forma nome do modelo_id existe nos modelos. Para esta tarefa, o relacionamento é um para muitos porque uma única pergunta pode possuir qualquer quantidade de respostas.
Em primeiro lugar, vamos definir esse relacionamento adicionando a seguinte função ao nosso Question
modelo.
... ... public function answers() { return $this->hasMany('ModelsAnswer'); } ... ...
Depois disso, no eloquent/app/controllers/Questions.php controller, vamos adicionar a seguinte função para obter perguntas com respostas.
... ... public static function get_questions_with_answers() { $questions = Question::with('answers')->get()->toArray(); return $questions; } ... ...
Ele recupera as perguntas com suas respostas correspondentes.
Vamos testar com o index.php arquivo conforme mostrado no trecho a seguir.
Você pode usar o var_dump
ou print_r
função para imprimir o $all
variável para ver os resultados.
Tarefa 6: obter todas as perguntas e usuários que as fizeram
Será um relacionamento um para um porque uma pergunta tem um usuário, então vamos adicionar o seguinte método ao Question
modelo.
... ... public function user() { return $this->belongsTo('ModelsUser'); } ... ...
Depois disso, no eloquent/app/controllers/Questions.php controller, vamos adicionar a seguinte função.
... ... public static function get_questions_with_users() { $questions = Question::with('user')->get()->toArray(); return $questions; } ... ...
Vamos testar com o index.php arquivo conforme mostrado no trecho a seguir.
Tarefa 7: obtenha uma pergunta com respostas e votos positivos
Primeiro, definimos uma relação entre respostas e votos positivos. Uma resposta tem muitos votos positivos, então a relação é de um para muitos.
Vamos adicionar a seguinte função ao nosso Answer
modelo:
... ... public function upvotes() { return $this->hasMany('ModelsUpvote'); } ... ...
No eloquent/app/controllers/Questions.php controller, vamos criar a seguinte função.
... ... public static function get_question_answers_upvotes($question_id) { $questions = Question::find($question_id)->answers()->with('upvotes')->get()->toArray(); return $questions; } ... ...
Vamos testar com o index.php arquivo conforme mostrado no trecho a seguir.
Podemos imprimir o $one_question
variável para ver os resultados.
Tarefa 8: conte todas as perguntas de um determinado usuário
Primeiramente, vamos importar o Question
modelo no eloquent/app/controllers/Users.php controlador:
use ModelsQuestion;
Depois de importá-lo, vamos adicionar a seguinte função no mesmo arquivo.
... ... public static function question_count($user_id) { $count = Question::where('user_id', $user_id)->count(); return $count; } ... ...
Finalmente, vamos testá-lo com o index.php arquivo conforme mostrado no trecho a seguir.
Retorna a contagem do número de perguntas que foram adicionadas por um usuário com id 1
.
Tarefa 9: atualizar a resposta de um usuário
O conceito de atualização com o Eloquent ORM é bastante simples. Primeiro encontramos um registro e depois modificamos e salvamos.
No eloquent/app/controllers/Answers.php controller, vamos adicionar esta função:
... ... public static function update_answer($answer_id,$new_answer) { $answer = Answer::find($answer_id); $answer->answer = $new_answer; $updated = $answer->save(); return $updated; } ... ...
Finalmente, vamos testá-lo com o index.php arquivo conforme mostrado no trecho a seguir.
Isso retorna um valor booleano — true — se a atualização for bem-sucedida.
Tarefa 10: excluir uma pergunta (exclusão reversível)
Por fim, implementaremos o recurso Eloquent SoftDelete.
Primeiramente, vamos importar o IlluminateDatabaseEloquentSoftDeletes
traço no Question
modelo com a seguinte declaração.
use IlluminateDatabaseEloquentSoftDeletes;
Depois de importado, podemos usá-lo assim.
use SoftDeletes;
Finalmente, vamos adicionar deleted_at
para o protected $dates
propriedade do modelo. Estas são as etapas necessárias.
protected $dates = ['deleted_at'];
Nosso Question
modelo agora se parece com isso:
hasMany('ModelsAnswer'); } public function user() { return $this->belongsTo('ModelsUser'); } } ?>
Em seguida, vá em frente e crie o delete_question
método no eloquent/app/controllers/Questions.php controlador.
... ... public static function delete_question($question_id) { $question = Question::find($question_id); $deleted = $question->delete(); return $deleted; } ... ...
Finalmente, vamos testá-lo com o index.php arquivo conforme mostrado no trecho a seguir.
Parabéns! Você acabou de construir um back-end totalmente funcional com Illuminate e Eloquent. E não precisamos escrever tanto código para conseguir tudo isso.
Conclusão
O Illuminate também vem com o Query Builder, que você pode usar para consultas de banco de dados ainda mais complexas e é definitivamente algo que você deseja experimentar e usar em seu aplicativo.
A única coisa que falta no Illuminate Database autônomo são as migrações de banco de dados, que são um recurso adorável do Laravel, e o Lumen, o microframework do Laravel. Você deve considerar o uso de ambos em seus aplicativos para aproveitar os recursos úteis que vêm com eles.
Você pode descobrir mais sobre o Eloquent na página de documentação oficial do Eloquent.
Referências
Este post foi atualizado com contribuições de Sajal Soni. Sajal pertence à Índia e adora passar o tempo criando sites baseados em estruturas de código aberto.