广告
  1. 代码
  2. 编码基础
  3. 数据库和SQL

在没有Laravel的PHP应用程序中使用Illuminate Database With Eloquent

滚动到顶部

Illuminate是拉拉维的数据库引擎减去拉拉维。它与Laravel的Eloquent ORM捆绑在一起。如果您想用ORM构建PHP应用程序,而不想使用Laravel,那么本教程适合您。

在本教程中,我们将使用PHP、Illuminate Database和Eloquent ORM构建一个问答应用程序的后端。

项目相关性

  • 5.5菲律宾比索+
  • MySQL数据库
  • 作曲家

应用程序功能

我们的应用程序将执行以下任务:

  • 添加用户
  • 添加问题
  • 添加问题的答案
  • 投票赞成回答
  • 得到一个有答案的问题
  • 获取所有问题和询问他们的用户
  • 获得特定的问题、答案和赞成票
  • 按特定用户计数问题
  • 更新用户的回答
  • 删除问题

首先,让我们创建项目目录和结构。在本教程的其余部分中,我假设雄辩的是我们的项目根目录名。

在主项目目录中,我们将创建一个 应用程序文件夹,然后在此应用程序文件夹,我们将创建两个文件夹:模型控制器.在这张图片中,我们的主要项目文件夹命名为雄辩的。你应该用你喜欢的名字来代替它。

项目组织机构项目组织机构项目组织机构

安装Eloquent Library

接下来,让我们为我们的项目安装依赖项。在主项目文件夹中,让我们创建雄辩的/作曲家.json文件。创建后,将以下代码粘贴到我们的雄辩的/作曲家.json文件。

1
{
2
 "名称": "启发-示例/雄辩",
 "描述": "用照明和口才实现数据库查询",
4
 "类型": "项目",
5
 "要求": {}
6
}

要安装Illuminate数据库库,我们添加“照明/数据库”:“^7.30”,到我们的雄辩的/作曲家.json文件。

接下来,让我们为模型和控制器添加PSR-4自动加载:

1
"自动加载": {
2
    "psr-4型": {
        "控制器\\": "应用程序/控制器/",
4
        "模型\\": "应用程序/模型/" 
5
    }
6
}

现在,我们的雄辩的/作曲家.json文件应如下所示:

1
{
2
    "名称": "以身作则/雄辩",
    "描述": "用Illuminat和Eloquent实现数据库查询",
4
    "类型": "项目",
5
    "要求": {
6
        "照明/数据库": "^7.30"
7
    },
8
     "自动加载": {
9
        "psr-4型": {
10
             "控制器\\": "应用程序/控制器/",
11
             "模型\\": "应用程序/模型/"
12
        }
13
    }
14
}

最后,让我们在项目目录的根目录中运行以下两个命令。

1
$作曲家 安装
2
$作曲家转储-自动加载-o(o)

设置数据库表和配置文件

让我们为数据库凭据添加一个配置文件。在主项目目录中,让我们创建一个名为雄辩的/配置.php并在中定义DB详细信息雄辩的/配置.php文件,如以下代码段所示。请注意,这些值应替换为您自己的连接详细信息。

1
<?php(电话)
2
定义(“DBDRIVER”)  定义(“DBDRIVER”,“mysql”);
定义(“DBHOST”)  定义(“DBHOST”,“本地主机”);
4
定义('DBNAME')  定义('DBNAME',“雄辩应用程序”);
5
定义(“DBUSER”)  定义(“DBUSER”,“root”);
6
定义(“DBPASS”)  定义(“DBPASS”,“通过”);
7
?>

接下来,让我们为我们的应用程序创建一个模式。

在为数据库中的表创建模式之前需要注意的一件事是,我们可以向模式中添加时间戳。

如果我们想在特定表或模型上启用时间戳操作,Eloquent ORM需要两个时间戳列。他们是创建_日期更新日期柱。如果我们为模型启用时间戳,Eloquent会随着我们创建或更新记录的时间自动更新这些字段。

第三列名为删除_日期. The删除_日期不过时间戳的工作方式不同。Eloquent具有软删除功能,它使用删除_日期列确定记录是否已被删除。如果你删除了一个有口才的记录删除函数,您可以启用软删除,该列将随删除时间更新。然后可以随时检索这些删除的项目。

在这个应用程序中,我们将利用时间戳,所以我们将在模式创建中使用这三个时间戳。

让我们在MySQL中使用以下命令创建表。

问题

让我们使用以下SQL语句创建问题表。

1
创建  `问题` (
2
 `标识` 整数(11) 未签名的 不是 无效的 自动增量,
 `问题` 小文本,
4
 `用户id` 整数(11) 违约 无效的,
5
 `创建_日期` 时间戳 无效的 违约 无效的,
6
 `更新于` 时间戳 无效的 违约 无效的,
7
 `删除_日期` 时间戳 无效的 违约 无效的,
8
 主要 钥匙 (`标识`)
9
) 发动机=InnoDB公司 违约 CHARSET(查尔斯特)=utf8接口;

答案

让我们使用以下SQL语句创建答案表。

1
创建  `答案` (
2
 `标识` 整数(11) 未签名的 不是 无效的 自动更正,
 `答案` 小文本,
4
 `用户id` 整数(11) 违约 无效的,
5
 `问题id` 整数(11) 违约 无效的,
6
 `创建_日期` 时间戳 无效的 违约 无效的,
7
 `更新于` 时间戳 无效的 违约 无效的,
8
 `删除_日期` 时间戳 无效的 违约 无效的,
9
 主要 钥匙 (`标识`)
10
) 发动机=InnoDB公司 违约 CHARSET(查尔斯特)=utf8接口;

赞成票

让我们使用以下SQL语句创建赞成票表。

1
创建  `赞成票` (
2
 `标识` 整数(11) 未签名的 不是 无效的 自动增量,
 `答案id` 整数(11) 违约 无效的,
4
 `用户id` 整数(11) 违约 无效的,
5
 `创建_日期` 时间戳 无效的 违约 无效的,
6
 `更新于` 时间戳 无效的 违约 无效的,
7
 `删除_日期` 时间戳 无效的 违约 无效的,
8
 主要 钥匙 (`标识`)
9
) 发动机=InnoDB公司 违约 CHARSET(查尔斯特)=utf8接口;

用户

让我们使用以下SQL语句创建用户表。

1
创建  `用户` (
2
 `标识` 整数(11) 未签名的 不是 无效的 自动增量,
 `用户名` 瓦查尔(100) 违约 无效的,
4
 `电子邮件` 瓦尔查尔(200) 违约 无效的,
5
 `密码` 瓦查尔(200) 违约 无效的,
6
 `创建_日期` 时间戳 无效的 违约 无效的,
7
 `更新于` 时间戳 无效的 违约 无效的,
8
 `删除_日期` 时间戳 无效的 违约 无效的,
9
 主要 钥匙 (`标识`)
10
) 发动机=InnoDB公司 违约 CHARSET(查尔斯特)=utf8接口;

现在我们已经完成了数据库设置。接下来,我们将创建应用程序中所需的模型文件。

设置Eloquent模型

首先,我们需要创建一个共同的数据库用于设置数据库连接的类。

这个数据库等级

创建雄辩/应用程序/模型/数据库.php使用您喜爱的文本编辑器创建文件并添加以下内容。

1
<?php(电话)
2
命名空间 模型; 
4
使用 照明\数据库\胶囊\管理器 作为 胶囊;
5
 
6
 数据库 {
7
    公众的 功能 __构造() 
8
    {
9
        $胶囊 = 新的 胶囊;
10
        $胶囊->添加连接([
11
             “驱动程序” => 数据库驱动程序,
12
             “主机” => 数据库主机,
13
             '数据库' => 数据库名称,
14
             '用户名' => 数据库用户,
15
             '密码' => DBPASS(DBPASS),
16
             '字符集' => “utf8”,
17
             '排序规则' => 'utf8_unicode _ ci',
18
             '前缀' => '',
19
        ]);
20
21
        //设置Eloquent ORM…
22
        $胶囊->战利品();
23
    }
24
}

在上面的文件中,我们已经初始化了胶囊类。接下来,我们使用了添加连接方法创建新的MySQL连接。最后,我们使用了战利品方法来初始化Eloquent模型。

这个用户模型

让我们创建雄辩的/app/models/User.php包含以下内容的文件。

1
<?php(电话)
2
命名空间 模型;
4
使用 \照明\数据库\显式\模型;
5
 
6
 用户 延伸 模型 {
7
    受保护的 $表 = '用户';
8
    受保护的 $可填充 = ['用户名', '电子邮件', '密码'];
9
}
10
?>

这个问题模型

让我们创建雄辩的/app/models/Question.php包含以下内容的文件。

1
<?php(电话)
2
命名空间 模型;
 
4
使用 \照明\数据库\口才\模型;
5
 
6
 问题 延伸 模型 {
7
    受保护的 $表 = “问题”;
8
    受保护的 $可填充 = [“问题”,'用户id'];
9
}
10
?>

这个答案模型

让我们创建雄辩的/app/models/Answer.php包含以下内容的文件。

1
<?php(电话)
2
命名空间 模型;
使用 \照明\数据库\口才\模型;
4
 
5
 答案 延伸 模型 {
6
    受保护的 $表 = '答案';
7
    受保护的 $可填充 = ['回答','用户id','问题id'];
8
}
9
?>

这个投赞成票模型

让我们创建雄辩/app/models/Upvote.php包含以下内容的文件。

1
<?php(电话) 
2
命名空间 模型;
 
4
使用 \照明\数据库\口才\模型;
5
 
6
 投赞成票 延伸 模型 {
7
    受保护的 $表 = “赞成票”;
8
    受保护的 $可填充 = ['应答器_id', '用户id'];
9
      
10
}
11
?>

这就是设置模型类的方法。

创建前控制器文件

在本节中,我们将创建核心引导和前端控制器文件。

这个引导程序.php文件

这是一个用于引导应用程序的通用文件。让我们创建引导.php文件。

1
<?php(电话)
2
要求 './配置.php';
要求 './vendor/autoload.php';
4
5
使用 模型\数据库;
6
7
//初始化Illuminate数据库连接
8
新的 数据库();
9
?>

我们还通过实例化数据库类。

这个索引.php文件

这是我们的应用程序的前端控制器,所以基本上它是我们应用程序的入口点。

让我们创建索引.php文件。

1
<?php(电话)
2
要求 “bootstrap.php”;
4
//下面是我们的示例代码。。。
5
?>

事实上,我们将使用索引.php文件来测试本文其余部分中的所有用例。

现在,我们也建立了模型。从下一节开始,我们将开始测试用例。

任务1:添加用户

首先,让我们创建雄辩者/app/controllers/Users.php具有以下内容的控制器文件。

1
<?php(电话)
2
命名空间 控制器;
使用 模型\用户;
4
 
5
 用户 {
6
    公众的 静止的 功能 创建_用户($用户名, $电子邮件, $密码)
7
    {
8
        $用户 = 用户::创造(['用户名'=>$用户名,'电子邮件'=>$电子邮件,'密码'=>$密码]);
9
        返回 $用户;
10
    }
11
}
12
?>

在我们的用户控制器类,我们已经创建了创建_用户方法,用于创建新用户。我们使用了创造方法雄辩的模型来创建新用户。

让我们从我们的索引.php文件来测试它,如下面的代码片段所示。请确保在实际存储密码之前对其进行了严格加密。不建议在数据库中存储纯文本密码。

1
<?php(电话)
2
要求 “bootstrap.php”;
4
使用 控制器\用户; 
5
 
6
$用户 = 用户::创建_用户(“用户1”, "user1@example.com", “user1_pass”);
7
?>

一旦您运行索引.php文件,它应该在用户表。

任务2:添加问题

首先,让我们创建雄辩的/app/controllers/Questions.php具有以下内容的控制器文件。

1
<?php(电话)
2
命名空间 控制器;
使用 模型\问题;
4
 
5
 问题{
6
    公众的 静止的 功能 创建_问题($问题,$用户id)
7
    {
8
        $问题 = 问题::创造([“问题”=>$问题,'用户id'=>$用户id]);
9
        返回 $问题;
10
    }
11
}
12
?>

在我们的问题控制器类,我们已经创建了创建_问题方法,用于创建新问题。我们使用了创造方法雄辩的创建一个新问题。

让我们从我们的索引.php文件来测试它,如下面的代码片段所示。

1
<?php(电话)
2
要求 “bootstrap.php”;
4
使用 控制器\问题; 
5
 
6
$问题 = 问题::创建_问题(“你见过你的替身吗?”, 1);
7
?>

一旦您运行索引.php文件,它应该在问题表。

任务3:添加问题的答案

在本节中,我们将了解如何为问题添加答案。

首先,让我们创建雄辩的/app/controllers/Answers.php包含以下内容的控制器文件。

1
<?php(电话)
2
命名空间 控制器;
使用 模型\答案;
4
 
5
 答案 {
6
     公众的 静止的 功能 添加应答器(_A)($答案,$问题id,$user_id(用户id))
7
     {
8
        $答案 = 答案::创造(['回答'=>$答案,'问题id'=>$问题id,'用户id'=>$用户id]);
9
        返回 $答案;
10
    }
11
}
12
?>

在我们的答案控制器类,我们已经创建了添加应答器(_A)方法,用于创建新的答案。

让我们从我们的索引.php文件来测试它,如下面的代码片段所示。

1
<?php(电话)
2
要求 “bootstrap.php”;
4
使用 控制器\答案; 
5
 
6
$个答案 = 答案::添加应答器(_A)(“这是一个答案”, 1, 2);
7
?>

一旦您运行索引.php文件,它应该在答案表。

任务4:投票支持答案

这些步骤与我们之前所做的步骤基本相同。

让我们在雄辩的/app/controllers/Answers.php控制器。

1
...
2
...
公众的 静止的 功能 upvote_answer(上行_应答)($answer_id,$用户id)
4
{
5
    $赞成票 = 投赞成票::创造(['回答_id'=>$answer_id,'用户id'=>$用户id]);
6
    返回 $赞成票;
7
}
8
...
9
...

您还需要导入投赞成票中的模型雄辩者/app/controllers/Answers.php控制器文件,添加以下代码。

1
使用 模型\向上投票;

最后,我们称之为索引.php文件来测试它,如下面的代码片段所示。

1
<?php(电话)
2
要求 “bootstrap.php”;
4
使用 控制器\答案; 
5
 
6
$赞成票 = 答案::upvote_answer(上行_应答)(1, 14);
7
?>

任务5:获得问题和答案

对于这样的任务,我们可以使用Eloquent关系。

关系类型包括一对一、一对多、多对多等。

在使用这些关系时,Eloquent采用以下形式的外键模型名称_模型上存在id。对于此任务,关系是一对多关系,因为一个问题可以拥有任意数量的答案。

首先,让我们通过将以下函数添加到我们的问题模型。

1
...
2
...
公众的 功能 答案()
4
{
5
    返回 $这个->有很多(“\模型\答案”);
6
}
7
...
8
...

之后,在雄辩的/app/controllers/Questions.php控制器文件,让我们添加以下函数来获取问题和答案。

1
...
2
...
公众的 静止的 功能 获取问题和答案()
4
{
5
    $个问题 = 问题::具有('答案')->得到()->到阵列();
6
    返回 $个问题;
7
}
8
...
9
...

它检索带有相应答案的问题。

让我们用索引.php文件,如以下代码段所示。

1
<?php(电话)
2
要求 “bootstrap.php”;
使用 控制器\问题; 
4
 
5
$全部 = 问题::获取问题和答案();
6
?>

您可以使用变量转储打印(_r)用于打印$全部变量查看结果。

任务6:获取所有问题和向其提问的用户

这将是一种一对一的关系,因为一个问题只有一个用户,所以让我们将以下方法添加到问题模型。

1
...
2
...
公众的 功能 用户()
4
{
5
    返回 $这个->属于To('\型号\用户');
6
}
7
...
8
...

之后,在雄辩的/app/controllers/Questions.php控制器文件,让我们添加以下函数。

1
...
2
...
公众的 静止的 功能 与用户一起获取问题()
4
{ 
5
    $个问题 = 问题::具有('用户')->得到()->到阵列();
6
    返回 $个问题; 
7
}
8
...
9
...

让我们用索引.php文件,如以下代码段所示。

1
<?php(电话)
2
要求 “bootstrap.php”;
使用 控制器\问题; 
4
 
5
$all_with_users(包含用户) = 问题::与用户一起获取问题();
6
?>

任务7:获得一个有答案和赞成票的问题

首先,我们定义了答案和赞成票之间的关系。答案有很多赞成票,所以关系是一对多的。

让我们将以下函数添加到我们的答案型号:

1
...
2
...
公众的 功能 赞成票()
4
{
5
    返回 $这个->有很多(“\Models\Upvote”);
6
}
7
...
8
...

雄辩的/app/controllers/Questions.php控制器文件,让我们创建以下函数。

1
...
2
...
公众的 静止的 功能 获取问题答案票数($问题id)
4
{ 
5
    $个问题 = 问题:找到($问题id)->答案()->具有('赞成票')->得到()->到阵列();
6
    返回 $个问题;
7
}
8
...
9
...

让我们用索引.php文件,如以下代码段所示。

1
<?php(电话)
2
要求 “bootstrap.php”;
4
使用 控制器\问题; 
5
6
$one_问题 = 问题::获取问题答案票数(1);
7
?>

我们可以打印$one_问题变量以查看结果。

任务8:统计特定用户的所有问题

首先,让我们导入问题中的模型雄辩的/app/controllers/Users.php控制器:

1
使用 模型\问题;

导入后,让我们在同一个文件中添加以下函数。

1
...
2
...
公众的 静止的 功能 问题_计数($用户id)
4
{
5
    $count个 = 问题::哪里('用户id', $用户id)->计数();
6
    返回 $count个;
7
}
8
...
9
...

最后,让我们用索引.php文件,如以下代码段所示。

1
<?php(电话)
2
要求 “bootstrap.php”;
使用 控制器\用户; 
4
 
5
$user_question_count = 用户::问题_计数(1);
6
?>

它返回id为的用户添加的问题数1

任务9:更新用户的答案

使用Eloquent ORM进行更新的概念非常简单。首先我们找到一个记录,然后进行变异并保存。

雄辩的/app/controllers/Answers.php控制器,让我们添加此函数:

1
...
2
...
公众的 静止的 功能 更新(_Swer)($answer_id(答复者id),$new_answer(新答案))
4
{
5
    $答案 = 答案::找到($answer_id);
6
    $答案->回答 = $new_answer(新答案);
7
    $已更新 = $答案->节约();
8
    返回 $已更新;
9
}
10
...
11
...

最后,让我们用索引.php文件,如以下片段所示。

1
<?php(电话)
2
要求 “bootstrap.php”;
使用 控制器\答案; 
4
 
5
$更新应答 = 答案::update_answer(更新应答)(1, “这是一个更新的答案”);
6
?>

如果更新成功,则返回布尔值true。

任务10:删除问题(软删除)

最后,我们将实现Eloquent SoftDelete功能。

首先,让我们导入照明\Database\Eloquent\SoftDeletes中的特性问题带有以下语句的模型。

1
使用 照明\Database\Eloquent\SoftDeletes;

进口后,我们可以这样使用它。

1
使用 软删除;

最后,让我们添加删除_日期受保护的$日期模型的属性。这些是必需的步骤。 

1
受保护的 $日期 = ['删除(_at)'];

我们的问题模型现在如下所示:

1
<?php(电话)
2
命名空间 模型;
 
4
使用 \照明\数据库\口才\模型;
5
使用 Illuminate\Database\Eloquent\SoftDeletes(发光\数据库\显式\软删除);
6
 
7
 问题 延伸 模型 {
8
    使用 软删除;
9
10
    受保护的 $表 = “问题”;
11
    受保护的 $可填充 = [“问题”,'用户id'];
12
    受保护的 $日期 = ['删除(_at)'];
13
14
    公众的 功能 答案()
15
    {
16
        返回 $这个->有很多(“\模型\答案”);
17
    }
18
19
    公众的 功能 用户()
20
    {
21
        返回 $这个->属于To('\型号\用户');
22
    }
23
}
24
?>

接下来,继续创建删除_问题中的方法雄辩的/app/controllers/Questions.php控制器。

1
...
2
...
公众的 静止的 功能 删除_问题($问题id)
4
{
5
    $问题 = 问题::找到($问题id);
6
    $已删除 = $问题->删除();
7
    返回 $已删除; 
8
}
9
...
10
...

最后,让我们用索引.php文件,如以下代码段所示。

1
<?php(电话)
2
要求 “bootstrap.php”;
使用 控制器\问题; 
4
 
5
$删除 = 问题::删除_问题(1);
6
?>

祝贺 你!您刚刚用Illuminate和Eloquent构建了一个功能齐全的后端。我们不必编写这么多代码来实现这一切。

结论

Illuminate还附带了Query Builder,您可以使用它进行更复杂的数据库查询,它绝对是您想要在应用程序中进行实验和使用的东西。

独立的Illuminate数据库中唯一缺少的是数据库迁移,这是Laravel和Lumen的一个可爱特性,后者是Laralve的微框架。你应该考虑在你的应用程序中同时使用这两种功能,以利用它们附带的有用功能。

您可以在官方口才文档页面.

工具书类

此帖子已更新,来自萨贾尔·索尼萨哈尔属于印度,他喜欢花时间创建基于开源框架的网站。

广告
广告
寻找有助于启动下一个项目的东西?
环境市场有一系列可供出售的商品,帮助您开始。