Illuminate是Laravel的数据库引擎减去Laravel。 它与Laravel中的Eloquent ORM捆绑在一起。 如果您想使用ORM来构建PHP应用程序并且不想使用Laravel,那么本教程适合您。
在本教程中,我们将使用PHP,Illuminate Database和Eloquent ORM构建Q&A应用程序的后端。
项目依赖
- PHP:5.5以上
- MySQL数据库
- 作曲家
应用功能
我们的应用程序将执行十项任务:
- 添加用户。
- 添加一个问题。
- 添加问题的答案。
- 支持答案。
- 提出有问题的答案。
- 获取所有问题和询问他们的用户。
- 获得特定的问题,答案和支持。
- 计算特定用户的问题。
- 按用户更新答案。
- 删除问题。
首先,我们创建项目目录和结构。
在主项目目录中,我们将创建一个应用程序文件夹,然后在此应用程序文件夹中,将创建两个文件夹: 型号和控制器。 在这张照片中,我们的主项目文件夹被命名为雄辩。 您应该将其替换为您喜欢的任何名称。
接下来,我们在主项目文件夹中创建与app文件夹相同级别的index.php文件。
我们将使用git,因此我们将创建一个.gitignore文件。 请注意,此步骤是可选的。
接下来,我们安装该项目正常运行所需的依赖项。 在主项目文件夹中,我们将创建一个composer.json文件。 然后将其粘贴到我们的composer.json文件中。
{
“name”: “illuminate-example/eloquent”,
“description”: “Implementation of Database Queries with illuminate and Eloquent”,
“type”: “project”,
“require”: {}
}
要安装Illuminate数据库,我们将其添加到composer.json中:
“illuminate/database”: “5.1.8”,
。
接下来,我们为模型和控制器添加psr-4自动加载功能:
“autoload”: {
“psr-4”: {
“Controllers\\”: “app/controllers/”,
“Models\\”: “app/models/” }
}
现在,我们的composer.json文件应如下所示:
{
“name”: “illuminate-example/eloquent”,
“description”: “Implementation of Database Queries with illuminate and Eloquent”,
“type”: “project”,
“require”: {
“illuminate/database”: “5.1.8”},
“autoload”:
{“psr-4”:
{ “Controllers\\”: “app/controllers/”,
“Models\\”: “app/models/"
}
}
}
现在,我们将在与composer.json文件相同的位置运行这两个composer命令:
composer install
composer dump-autoload -o
这将生成一个供应商文件夹,我们可以将其添加到gitignore(这也是可选步骤)。
让我们为数据库凭据添加一个配置文件。
在主项目目录中,我们创建一个名为config.php的文件,并在Config.php文件中定义数据库详细信息。 请注意,这些值应替换为您自己的连接详细信息。
<?php
defined(“DBDRIVER”)or define(‘DBDRIVER’,’mysql’);
defined(“DBHOST”)or define(‘DBHOST’,’localhost’);
defined(“DBNAME”)or define(‘DBNAME’,’eloquent-app’);
defined(“DBUSER”)or define(‘DBUSER’,’root’);
defined(“DBPASS”)or define(‘DBPASS’,’pass’);
接下来,我们为我们的应用程序创建架构。
在为数据库中的表创建模式之前要注意的一件事是,我们可以向模式添加时间戳。
如果我们想在特定的表/模型上启用时间戳操作,则雄辩的ORM希望有两个时间戳列。 它们是created_at
和updated_at
列。 如果我们为模型启用了时间戳记,则Eloquent会使用创建或更新记录的时间自动更新这些字段。
第三列称为deleted_at
。 不过, deleted_at
时间戳的工作方式有所不同。 Eloquent具有软删除功能,该功能使用deleted_at
列确定记录是否已删除。 如果您使用雄辩的“删除”功能删除记录并启用“软删除”,则该列会随着删除时间进行更新。 然后可以随时检索这些删除的项目。
在此应用程序中,我们将利用时间戳记,因此将在架构创建中使用这三个时间戳。
在MySQL中使用以下命令创建表:
问题
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;
答案
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;
投票
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;
用户数
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;
我们将在以下位置为表创建模型和控制器文件:
- 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
使用编辑器打开models / database.php 。
首先,我们创建胶囊:
<?php
namespace Models;
use Illuminate\Database\Capsule\Manager as Capsule;
class Database {
function __construct() {
$capsule = new Capsule;
$capsule->addConnection([
‘driver’ => DBDRIVER,
‘host’ => DBHOST,
‘database’ => DBNAME,
‘username’ => DBUSER,
‘password’ => DBPASS,
‘charset’ => ‘utf8’,
‘collation’ => ‘utf8_unicode_ci’,
‘prefix’ => ‘’,
]);
// Setup the Eloquent ORM…
$capsule->bootEloquent();
}
}
在上面的文件中,我们使用config.php中定义的常量初始化并设置了胶囊,然后雄辩地启动了。
下一步是创建启动脚本。 这将是运行我们的应用程序之前必须运行的所有文件的文件。
我们在位置project_folder / start.php中创建一个开始文件,然后在该文件中要求Composer自动加载文件:
require 'vendor/autoload.php';
之后,我们需要config.php来获取定义的凭证: require 'config.php';
然后我们初始化数据库类。
<?php
use Models\Database;
//Boot Database Connection
new Database();
您的start.php应该如下所示:
<?php
require ‘config.php’;
require ‘vendor/autoload.php’;
use Models\Database;
//Initialize Illuminate Database Connection
new Database();
?>
在您的index.php中包含start.php,因为这将是我们的主文件。
现在,我们的index.php文件如下所示:
<?php
require ‘start.php’;
?>
接下来,我们可以开始研究控制器和模型。 在project_folder / app / models / question.php中,我们添加以下内容:
<?php
namespace Models;
use \Illuminate\Database\Eloquent\Model;
class Question extends Model {
protected $table = ‘questions’;
}
?>
然后在project_folder /app/controllers/questions.php中 :
<?php
namespace Controllers;
class Questions{
}
?>
在project_folder /app/controllers/answers.php中 ,我们执行以下操作:
<?php
namespace Controllers;
class Answers{
}
?>
任务1:添加用户
在用户模型( project_folder /app/models/user.php)中,我们添加以下代码来定义我们的名称空间,扩展Eloquent模型并定义表名( protected $table
)以及protected $table
哪些字段可以填充通过大量创建( protected $fillable
)。
<?php
namespace Models;
use \Illuminate\Database\Eloquent\Model;
class User extends Model {
protected $table = ‘users’;
protected $fillable = [‘username’,’email’,’pass’];
}
?>
在用户控制器( project_folder /app/controllers/user.php )中,我们照常定义名称空间和类:
<?php
namespace Controllers;
class Users{
}
?>
然后要创建一个用户,在用户控制器中,我们导入用户Model命名空间, use Models\User;
,然后添加一个函数来创建用户。
<?php
public static function create_user($username, $email, $password){
$user = User::create(['username'=>$username,'email'=>$email,'password'=>$password]);
return $user;
}
我们的用户控制器现在看起来像这样。
<?php
namespace Controllers;
use Models\User;
class Users {
public static function create_user($username, $email, $password){
$user = User::create(['username'=>$username,'email'=>$email,'password'=>$password]);
return $user;
}
}
?>
然后在index.php中,添加以下行并运行应用程序以创建新用户。
<?php
use Controllers\Users;
// Import user controller
$user = Users::create_user(“user1”,”user1@example.com”,”user1_pass”);
任务2:添加问题
要添加问题,我们将问题模型名称空间导入问题控制器,并编写一个create_question
函数:
use Models\Question;
然后:
<?php
public static function create_question($question,$user_id){
$question = Question::create(['question'=>$question,'user_id'=>$user_id]);
return $question;
}
我们已经使用Eloquent大量创建模型来插入此记录,但是在它起作用之前,我们需要允许这些字段可填充,因为Eloquent模型默认情况下会阻止大量创建。
因此,我们进入question
模型并将protected $fillable
属性添加到类中。
protected $fillable = ['question','user_id'];
要运行此命令,请将问题控制器导入index.php并静态调用create_question
函数:
use Controllers\Question;
然后使用问题和用户ID作为参数创建一个问题:
$question = Questions::create_question("Have you ever met your doppelganger?",1);
如果成功,则返回模型对象。
现在,我们将使用不同的条目运行index.php脚本,以向数据库中添加更多问题。
任务3:为问题添加答案
在答案模型中,我们通过添加以下代码来重复针对问题和用户模型采取的步骤:
<?php
namespace Models;
use \Illuminate\Database\Eloquent\Model;
class Answer extends Model {
protected $table = ‘answers’;
protected $fillable = [‘answer’,’user_id’,’question_id’];
}
?>
然后在答案控制器中,我们编写以下行:
<?php
namespace Controllers;
use Models\Answer;
class Answers {
public static function add_answer($answer,$question_id,$user_id){
$answer = Answer::create(['answer'=>$answer,'question_id'=>$question_id,'user_id'=>$user_id]);return $answer;
}
}
?>
然后,在index.php中,我们可以为前面添加的ID 1(用户ID为2)创建问题的答案。不要忘记首先将答案控制器导入index.php。
<?php
use Controllers\Answers;
$answers = Answers::add_answer(“This is an answer”,1,2);
为防止出现多个条目,请在运行一个新的注释之前在index.php中注释所有其他调用。
任务4:批准答案
这几乎与我们惯用的步骤相同。
因此,我们将其复制到位于project_folder / app / models / upvote.php的Upvote模型中。
<?php
namespace Models;
use \Illuminate\Database\Eloquent\Model;
class Upvote extends Model {
protected $table = 'upvotes';
protected $fillable = ['answer_id','user_id'];
}
?>
然后在答案控制器中,导入Upvote Model命名空间。
use Models\Upvote;
然后,我们创建一个upvote_answer
函数。
<?php
public static function upvote_answer($answer_id,$user_id){
$upvote = Upvote::create(['answer_id'=>$answer_id,'user_id'=>$user_id]);
return $upvote;
}
在index.php中,我们可以使用虚拟用户ID调用该函数以对ID为1的答案进行投票。
$upvote = Answers::upvote_answer(1,14);
任务5:回答问题
对于这样的任务,我们可以使用雄辩的关系。
关系的类型包括一对一,一对多,多对多等。
使用这些关系时,Eloquent假定模型上存在模型名 _id形式的外键。 对于此任务,该关系是一对多关系,因为单个问题可以拥有任意数量的答案。
首先,我们通过将此函数添加到问题模型中来定义这种关系。
<?php
public function answers()
{
return $this->hasMany('\Models\Answer');
}
然后在问题控制器中,我们编写一个函数以获取具有答案的问题。
<?php
public static function get_questions_with_answers(){
$questions = Question::with('answers')->get()->toArray();
return $questions;
}
这将检索问题及其相应的答案。
在index.php中,我们注释所有其他调用并运行:
$all = Questions::get_questions_with_answers();
我们可以在var_dump
或print_r
$all
变量中查看结果。
任务6:获取所有问题和询问他们的用户
这是一对一的关系,因为一个问题有一个用户,因此我们将其添加到问题模型中。
<?php
public function user()
{
return $this->belongsTo(‘\Models\User’);
}
然后,我们在问题控制器中创建一个函数,并在问题模型上使用with
函数。
<?php
public static function get_questions_with_users(){
$questions = Question::with('user')->get()->toArray();
return $questions;
}
在index.php中,注释所有其他内容并运行:
$all_with_users = Questions::get_questions_with_users();
任务7:通过答案和投票获得一个问题
首先,我们定义答案和投票之间的关系。 答案有很多赞成票,因此这种关系是一对多的。
因此,我们将以下函数添加到我们的答案模型中:
<?php
public function upvotes()
{
return $this->hasMany('\Models\Upvote');
}
然后在问题控制器中,我们创建函数来获取此信息:
<?php
public static function get_question_answers_upvotes($question_id){
$questions = Question::find($question_id)->answers()->with('upvotes')->get()->toArray();
return $questions;
}
与前面的步骤一样,我们注释对index.php的所有其他调用并运行此命令:
$one_question = Questions::get_question_answers_upvotes(1);
我们可以打印$one_question
变量以查看结果。
任务8:计算特定用户的所有问题
首先,我们将问题模型导入用户控制器中:
use Models\Question;
然后我们编写此函数:
<?php
public static function question_count($user_id){
$count = Question::where('user_id',$user_id)->count();
return $count;
}
在index.php中,我们注释其他调用并添加以下行:
$user_question_count = Users::question_count(1);
这将返回一个整数,该整数是ID为1的用户添加的问题数。
我们可以打印$user_question_count
变量并运行index.php以查看结果。
任务9:按用户更新答案
用Eloquent ORM进行更新的概念非常简单。 首先我们找到一条记录,然后我们进行变异并保存。
现在,在答案控制器中,我们添加以下功能:
<?php
public static function update_answer($answer_id,$new_answer){
$answer = Answer::find($answer_id);
$answer->answer = $new_answer;
$updated = $answer->save();
return $updated;
}
在index.php中,我们可以注释所有其他呼叫,并更新ID为1的答案,如下所示:
$update_answer = Answers::update_answer(1,”This is an updated answer”);
如果更新成功,则返回布尔值-true。
任务10:删除问题(软删除)
在这最后的任务中,我们将实现Eloquent SoftDelete。
首先,通过导入SoftDeletes
命名空间,然后在我们的类中使用SoftDeletes
特性,告诉问题模型使用SoftDeletes
。
use Illuminate\Database\Eloquent\SoftDeletes;
然后在类声明行之后,添加以下行:
use SoftDeletes;
然后,将deleted_at
添加到该模型的protected $dates
属性中。 这些是必需的步骤。
protected $dates = ['deleted_at'];
现在,我们的问题模型如下所示:
<?php
namespace Models;
use \Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Question extends Model {
use SoftDeletes;
protected $table = 'questions';
protected $fillable = ['question','user_id'];
protected $dates = ['deleted_at'];
public function answers()
{
return $this->hasMany('\Models\Answer');
}
public function user()
{
return $this->belongsTo('\Models\User');
}
}
?>
然后,我们在问题控制器中创建delete_question
函数。
<?php
public static function delete_question($question_id){
$question = Question::find($question_id);
$deleted = $question->delete();
return $deleted;
}
在index.php中运行:
$delete = Questions::delete_question(1);
恭喜你! 您刚刚使用Illuminate和Eloquent构建了功能齐全的后端。 而且,我们无需编写太多代码即可实现所有这些目标。
结论
Illuminate还附带了查询生成器,您可以将其用于更复杂的数据库查询,并且绝对是您要尝试并在您的应用程序中使用的东西。
独立的Illuminate数据库中唯一缺少的是数据库迁移,这是Laravel和Laravel的微框架Lumen的一个可爱功能。 您应该考虑在应用程序中同时使用两者,以利用它们附带的有用功能。
您可以在官方口才文档页面上找到有关口才的更多信息。