parvezmrobin/db-model

以OOP风格最简单地检索MySQL数据库实例

0.6.1 2017-11-12 09:49 UTC

This package is not auto-updated.

Last update: 2024-09-29 03:00:01 UTC


README

以OOP风格最简单地检索MySQL数据库实例

初始化

设置数据库名称

\DbModel\Model::$database = 'database';

检索所有实例

获取所有实例

$users = \DbModel\Model::all('users')

现在您可以以面向对象的方式访问 User 的所有属性。

$user = $users[0];
echo $user->name;
echo $user->email;
echo $users[2]->birth_day;

如果不希望检索所有字段?只需在 all() 方法中添加额外的数组或字符串,以表示您需要的字段。

$users = \DbModel\Model::all('users', 'name, email');
$users = \DbModel\Model::all('users', ['name', 'email']); // Same as previous
echo $users[0]->birth_day // Results error

条件检索

想要根据条件检索实例?使用 where() 方法并给出条件。

$adults = \DbModel\Model::where('users', 'age > 18');
$maleAdults = \DbModel\Model::where('users', 'age > 18 AND sex = "Male"');
$maleAdultNames = \DbModel\Model::where('users', 'age > 18 AND sex = "Male"', 'name');

检索单个实例

想要根据ID检索单个用户?使用 find() 方法简化操作。

$user = \DbModel\Model::find('users', '1');
$user = \DbModel\Model::find('users', 5);
注意,where()all() 方法返回实例数组,而 find() 方法返回单个实例。

如果您的主键不是名为 'id',那么您必须提及它。

$user = \DbModel\Model::find('users', '1', 'user_id');

并且显然列作为最后一个参数。

$user = \DbModel\Model::find('users', '1', 'user_id', 'first_name, last_name');

$columns = ['first_name', 'last_name'];
$user = \DbModel\Model::find('users', '1', 'user_id', $columns);

使用关系检索

DB-Model 支持 一对一多对一多对多 关系。但是,您也可以使用这些方法来检索您的 一对一 关系。

注意,oneToMany()manyToOne()manytoMany() 是实例方法。而 all()where()find() 是静态方法。

一对一

比如说,您的 User 有多个 Post。因此,Post 必须有一个 user_id 字段来存储 User 的主键。在 Post 中的 user_id 字段被称为 外键。同样,Userid 被称为 引用键,因为它由 Post 中的 user_id 引用。您可以使用 oneToMany() 方法轻松检索 UserPost。最简单的形式是

$user = \DbModel\Model::find('users', '1');
$posts = $user->oneToMany('posts', 'user_id');

如果 User 的主键不是 id,那么你应该猜猜下一步该传递什么。

$user = \DbModel\Model::find('users', '1', 'user_primary_key');
$posts = $user->oneToMany('posts', 'user_id', 'user_primary_key');

// To retrieve Post that contains 'ghost' in title

$posts = $user->oneToMany('posts', 'user_id', 'user_primary_key',
    'title LIKE "%ghost%"');

// To retrieve title and body only
$posts = $user->oneToMany('posts', 'user_id', 'user_primary_key',
    'TRUE', 'title, body');

如果您足够聪明,您应该理解,oneToMany() 也可以用于存储 一对一 关系。如果 SettingsUser一对一 关系,那么每个 User 将恰好有一个 Settings。那么您还在等什么呢?

$user = \DbModel\Model::find('users', '1');
$settings = $user->oneToMany('settings', 'user_id')[0]; //Retrieves the only settings user have.

当然,您也可以使用其他参数。

多对一

如果您需要从一个 Post 实例获取相应的 User 实例?manyToOne() 就在这里,具有相同的签名。

$post = \DbModel\Model::find('posts', '1');
$user = $post->manyToOne('user', 'user_id');

如果您的 User 有一个不同于 id 的主键,那么也请说明。

$post = \DbModel\Model::find('posts', '1');
$user = $post->manyToOne('user', 'user_id', 'user_primary_key');

// To specify the columns

$user = $post->manyToOne('user', 'user_id', 'user_primary_key', 'name, email');

再次,如果您想使用 反向 一对一 关系检索,也可以使用 manyToOne() 方法。

$settings = \DbModel\Model::find('settings', '1');
$user = $post->manyToOne('user', 'user_id', 'user_primary_key');

多对多

要在数据库中实现 多对多 关系,您需要一个包含相关表外键的中间表。假设 PostTag 有多对多关系。那么,您需要一个包含 PostTag 外键的中间表,例如 post_tag,它包含 PostTag 的外键,例如 post_idtag_id。现在,您的代码将是

$post = \DbModel\Model::find('posts', '1');
$tags = $post->manytoMany('tags', 'post_tag', 'post_id', 'tag_id');

// Or inversely
$tag = \DbModel\Model::find('tags', '1');
$posts = $tag->manytoMany('posts', 'post_tag', 'tag_id', 'post_id');

如果模型有不同的主键而不是 id,那么也请说明。

$post = \DbModel\Model::find('posts', '1', 'post_primary_key');
$tags = $post->manytoMany('tags', 'post_tag', 'post_id', 'tag_id',
    'post_primary_key', 'tag_primary_key');

// Or inversely
$tag = \DbModel\Model::find('tags', '1', 'tag_primary_key');
$posts = $tag->manytoMany('posts', 'post_tag', 'tag_id', 'post_id',
    'tag_primary_key', 'post_primary_key');
    
// Select conditionally
$posts = $tag->manytoMany('posts', 'post_tag', 'tag_id', 'post_id',
    'tag_primary_key', 'post_primary_key', 'title LIKE "%ghost%"');

// Select columns as well
$posts = $tag->manytoMany('posts', 'post_tag', 'tag_id', 'post_id',
    'tag_primary_key', 'post_primary_key',
     'title LIKE "%ghost%"', ['name', 'body']);

插入

要将 Model 插入数据库,只需创建一个 Model 实例。设置属性。调用 store() 方法。

$user = new Model();
$user->name = 'Dennis Ritchie';
$user->email = 'dennis@example.com';
$user->password = 'pa$$word';
$user->store('users');

store() 方法有两个同义词,即 insert()save(),具有相同的签名。

更新

创建一个模型。仅设置要更新的属性。调用带有表名和更新操作条件的 update() 方法。就这样!

$user = new Model();
$user->name = 'Christian Bale';
$user->update('users', 'id = 5');

为了避免错误,update() 方法没有默认的 $condition 参数。

想要使用主键更新吗?那么您将更倾向于使用 updateById() 方法。

$user = new Model();
$user->id = 5;
$user->name = 'Christian Bale';
$user->updateById('users');

当您的主键不是 id 时,您必须将主键的名称作为下一个参数传递。

$user = new Model();
$user->primary_key = 5;
$user->name = 'Christian Bale';
$user->updateById('users', 'primary_key');

自定义连接参数

有五个公共静态字段用于与数据库连接。这些是 $host$database$username$password$port。这些字段的默认值如下

public static $host = 'localhost';
public static $username = 'root';
public static $password = '';
public static $port = '3306';

您可以根据自己的数据库更改这些值。

执行原始查询

尽管不推荐,但您可以使用 \DbModel\Query 类来执行原始查询。只需创建一个 \DbModel\Query 实例并运行您的查询。

$query = "SELECT * FROM table WHERE 1 = TRUE"
$result = (new \DbModel\Query('database_name'))->run($query);

foreach($result as $row) {
    foreach($row as $key => $value) {
        echo $key, ': ', $value;
    }
    echo '<br>';
}