parvezmrobin / db-model
以OOP风格最简单地检索MySQL数据库实例
Requires
- php: ^5.3.3 || ^7.0
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 字段被称为 外键。同样,User 的 id 被称为 引用键,因为它由 Post 中的 user_id 引用。您可以使用 oneToMany() 方法轻松检索 User 的 Post。最简单的形式是
$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() 也可以用于存储 一对一 关系。如果 Settings 与 User 有 一对一 关系,那么每个 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');
多对多
要在数据库中实现 多对多 关系,您需要一个包含相关表外键的中间表。假设 Post 与 Tag 有多对多关系。那么,您需要一个包含 Post 和 Tag 外键的中间表,例如 post_tag,它包含 Post 和 Tag 的外键,例如 post_id 和 tag_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>';
}