介绍

在本文中,我不会谈论使用 ORM(= Object Relational Mapper)的好处或 ORM 是什么。一个曾经写过扁平化 PHP 的 PHPer 第一次来到 ORM 世界时,很难把握 1 条记录 = 1 个对象的 ORM 世界的形象,写出来是为了填补空白。

头等舱?目的?实例?财产?方法?如果您对诸如此类的术语感到困惑https://www.php.net/manual/ja/language.oop5.php在另一个选项卡中打开该区域并在来回时阅读它可能是个好主意。

读取数据

传统的思维方式

はじめてORM(Eloquent, Doctrine)を使うことになったPHPerのための手引き

如上图所示的数据库表中存储的数据,以数据库的形式复制为数组。
在 PDO 中编写如下所示:

<?php
/** @var \PDO $pdo */
$statement = $pdo->query('SELECT id, title FROM books');
foreach ($statement->fetchAll(PDO::FETCH_ASSOC) as $item) {
    $bookId = $item['id'];
    $bookTitle = $item['title'];
    $bookPrice = $item['price'];
}

在 ORM 中思考

はじめてORM(Eloquent, Doctrine)を使うことになったPHPerのための手引き

在 ORM 的世界中,每一行记录(= 1 本书)都作为 Book 类的一个实例被检索。
如上图所示,Book类实例在表中浮动,根据条件取回使用。

book 表的一行中包含的数据(本例中为 id、title 和 price)是从 Book 类中提取的。

<?php

$books = $queryBuilder->findAll();

foreach ($books as $book) {
    $bookId = $book->getId();
    $bookTitle = $book->getTitle();
    $bookPrice = $book->getPrice();
    // 直接Bookのpublicプロパティとして取得できるライブラリもある
    $bookId = $book->id;
    $bookTitle = $book->title;
    $bookPrice = $book->price;
}

在上面的例子中,$queryBuilder->findAl()实际上是使用PDO来获取数据的,
从数据库中检索的数据作为 Book 类的实例返回,程序员
您可以将 Book 类中实现的必要方法与 books 表中的一行记录一起使用,或者将 Book 类用作
您可以将其视为一种类型并将其传递给一个类,该类在将一行记录分组为一个的状态下执行一些处理。

<?php

$book->getPriceWithTax(); // この$bookのDB上のpriceが1000だったら、10パーセントの消費税を加算して1100を返す

写入数据

当您注册一本新书或更新一本书的价格时,请考虑一下。
如果你把人类的话“我想注册一本新书”和“我想更新一本书的价格”改写成数据库的话,它将如下。

我想注册一本新书=我想在books表中创建一个新的单行记录(我想插入它)
我想更新这本书的价格 = 我想更新 book 表中特定行的价格(我想更新)

传统的思维方式

当您想注册一本书时,只需构造并发出 INSERT 语句。
当你想更新这本书时,只需构造并发出一个 UPDATE 语句。

<?php

/** @var \PDO $pdo */
$pdo->exec('INSERT INTO books(id, title, price) VALUES(6, "本6", 2900)');
$pdo->exec('UPDATE books SET price = 1200 WHERE id = 1');

在 ORM 中思考

Book 类实例$book 原样表示一行记录,因此如果要注册新记录,请创建一个新的Book 类实例$book 并将其保存在数据库中。

<?php

$book = new Book(); // 新しいBookを作る
$book->setId(6);
$book->setTitle('本6');
$book->setPrice(2900);

同样,如果您想更新一本书的价格,请更新您要更新的$bookprice 属性。

<?php

$book->setPrice(1200); // いままで1000円で売られていた本の価格を1200円に更新

有两种主要方法可以保存新创建的或已更新价格的$book
(由于ORM不同,请根据您使用的ORM库阅读。)

Active Record 模式(Laravel 的 Eloquent、Ruby on Rails 等)

$book 有一种保存方法(如 save() ),您可以通过调用它来保存。

// $bookは新規に作られたBookのインスタンス、またはデータベースから呼び出した$bookのプロパティを更新したもの
$book->save();

作为一种实现,$book 本身内部有一个到数据库的连接实例(通常是$pdo),当调用 save() 时,它会构建并执行 INSERT 和 UPDATE 语句。

DataMapper 模式(DoctrineORM、Hibernate 等)

有名为ObjectManagerEntityManager 的类共同管理表示应存储在数据库中或从数据库中检索的记录的实例。

$entityManager->persist($book);
$entityManager->flush();

作为一种实现,$entityManager而不是$book本身在内部有一个到数据库的连接实例(通常是$pdo),当persist()、flush()被调用时,INSERT语句或UPDATE语句会构建并执行。


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308622792.html

相关文章: