captainshoyu / shoyu
PHP网站开发的实用代码集合,使开发过程更轻松。仅适用于小型项目。
dev-master
2019-04-25 01:09 UTC
Requires
- php: >=7.1.0
This package is auto-updated.
Last update: 2024-09-25 13:23:21 UTC
README
PHP网站开发的实用代码集合,使开发过程更轻松。仅适用于小型项目。
安装
composer require captainshoyu/shoyu
// Asegúrate de requerir el archivo autoload de Composer.
require 'vendor/autoload.php';
// Si por alguna razón no puedes usar composer, puedes incluir el propio autoload.php de la librería.
require 'shoyu/autoload.php';
数据库
用于执行数据库连接和查询(使用SQL或查询构建器)的所有必要功能。支持的引擎
- PostgreSQL
- SQLite
- MySQL
连接示例
$factory = new \Shoyu\Database\ConnectionFactory;
$config = [
'database' => 'dbname',
'username' => 'your-user',
'password' => 'your-password',
'driver' => 'mysql',
'host' => 'localhost',
'port' => 5432
'charset' => 'utf8'
];
// El segundo argumento de make() nos creará un alias
$conn = $factory->make($config, 'DB')->connect();
// Realizar una consulta
$conn->fetchAll('select * from my_table');
// Realizar una consulta usando el alias creado anteriormente
DB::fetchAll('select * from my_table');
查询快捷方式
$firstRow = $conn->fetch('SELECT * FROM users WHERE username = ?', ['captainshoyu']);
$allRows = $conn->fetchAll('SELECT * FROM users WHERE state = ?', ['active']);
$firstColumnFirstRow = $conn->fetchColumn('SELECT COUNT(*) FROM users WHERE state = ?', ['active']);
$affectedRows = $conn->rowCount('UPDATE users SET full_name = ? WHERE id = ?', ['Captain Shoyu', 29]);
查询构建器
获取表中所有记录
$rows = $conn->table('users')->get();
获取第一条记录
$row = $conn->table('users')->first();
通过ID查找单个记录
$row = $conn->table('users')->find(6);
上述查询假设你的表的主键名为 'id',并且你想要获取所有列。如果你只想获取某些列,你可以在一个数组中指定它们。
$row = $conn->table('users')->find(6, ['id', 'name', 'email']);
通过特定字段查找单个记录
$row = $conn->table('users')->findBy('email', 'shoyu@example.com');
// Especificando las columnas
$row = $conn->table('users')->findBy('email', 'shoyu@example.com', ['id', 'name', 'email']);
选择列
$allRows = $conn->table('users')->select('name', 'email')->get();
// También se puede pasar un array como argumento a select()
$columns = ['id', 'name', 'email', 'status'];
$allRows = $conn->table('users')->select($columns)->get();
Limit和Offset
$conn->table('users')->limit(10)->offset(100);
Where
$conn->table('user')
->where('username', '=', 'shoyu')
->whereNotIn('age', [10, 20, 30])
->orWhere('type', '=', 'admin')
->orWhereNot('name', 'LIKE', '%Smith%')
->get();
上述查询将转换为以下SQL语句
SELECT *
FROM `user`
WHERE
`username` = ? AND
`age` NOT IN (?, ?, ?) OR
`type` = ? OR
NOT `name` LIKE ?
查询参数
["shoyu", 10, 20, 30, "admin", "%Smith%"]
嵌套Where
$conn->table('users')
->where('age', '>', 10)
->orWhere(function ($subWhere) {
$subWhere->where('surname', '=', 'Meltrozo')
->where('age', '>', 20);
})
->get();
SELECT * FROM `users` WHERE `age` > ? OR (`surname` = ? AND `age` > ?)
[10, "Meltrozo", 20]
Group By和Having
$users = DB::table('users')
->groupBy('account_id')
->having('account_id', '>', 100)
->get();
HavingRaw
$users = $conn->table('orders')
->select('department', $conn->raw('SUM(price) as total_sales'))
->groupBy('department')
->havingRaw('SUM(price) > 2500')
->get();
Order by
$users = $conn->table('users')
->where('type', '<>', 'admin')
->orderBy('surname', 'asc')
->get();
// También se puede hacer de la siguiente manera
$users = $conn->table('users')
->orderBy(['id' => 'asc', 'surname' => 'desc'])
->get();
// Lo anterior sería lo mismo que:
// SELECT * FROM `users` ORDER BY `id` asc, `surname` desc
连接
// INNER JOIN
$users = $conn->table('users')
->join('contacts', 'users.id', '=', 'contacts.user_id')
->join('orders', 'users.id', '=', 'orders.user_id')
->select('users.*', 'contacts.phone', 'orders.price')
->get();
// LEFT JOIN
$users = $conn->table('users')
->leftJoin('posts', 'users.id', '=', 'posts.user_id')
->get();
// JOINs avanzados
$conn->table('users')
->join('contacts', function ($join) {
$join->on('users.id', '=', 'contacts.user_id')
->where('contacts.user_id', '>', 5);
})
->get();
上述高级JOIN示例将转换为以下SQL语句
SELECT *
FROM `users`
INNER JOIN `contacts`
ON `users`.`id` = `contacts`.`user_id` AND
`contacts`.`user_id` > ?
子查询
$query = $conn->table('category')
->select('id')
->where('name', '=', 'Notebook')
->limit(1);
$conn->table('product')
->where('category_id', '=', $conn->subQuery($query))
->get();
SELECT *
FROM `product`
WHERE `category_id` = (
SELECT `id` FROM `category` WHERE `name` = ? LIMIT 1
)
聚合
$counted = $conn->table('users')->where('status', 'active')->count();
$minAge = $conn->table('users')->min('age');
$maxAge = $conn->table('users')->max('age');
$average = $conn->table('users')->avg('age');
$sum = $conn->table('users')->sum('age');
插入
$data = [
'name' => 'shoyu',
'email' => 'shoyu@sushiwithshoyu.net',
'status' => 'active',
'is_admin' => false,
];
$conn->table('users')->insert($data);
// Obtener el id del registro insertado
$id = $conn->table('users')->insertGetId($data);
更新
$conn->table('users')
->where('id', 29)
->update([
'is_admin' => true,
'email' => 'shoyu@sukiyakiwithshoyu.com'
]);
Increment和Decrement
查询构建器提供方法,允许我们增加或减少特定列的值,避免编写繁琐的update语句。
// Incrementa el valor de 1 en 1 (SET votes = votes + 1)
$conn->table('users')->increment('votes');
// Incrementa el valor de 5 en 5 (SET votes = votes + 5)
$conn->table('users')->increment('votes', 5);
// Decrementa el valor de 1 en 1 (SET votes = votes - 1)
$conn->table('users')->decrement('votes');
// Decrementa el valor de 5 en 5 (SET votes = votes - 5)
$conn->table('users')->decrement('votes', 5);
删除
$conn->table('users')->delete();
// Borrar todos los usuarios con menos de 100 votos
$conn->table('users')->where('votes', '<', 100)->delete();
“原始”表达式
有时我们需要使用SQL文本表达式,为此我们可以使用$conn->raw方法注入查询或查询的一部分作为字符串,但请注意,我们需要小心以避免SQL注入。
$users = $conn->table('users')
->select($conn->raw('count(*) as user_count, status'))
->where('status', '<>', 'blocked')
->groupBy('status')
->get();
获取SQL和将要使用的参数
$query = $conn->table('users')
->select('id', 'name', 'email')
->where('status', '=', 'active');
$query->toSql();
// -> SELECT `id`, `name`, `email` FROM `users` WHERE `status` = ?
$query->getBindings(); // -> ['active']
获取PDO实例
$conn->getPdo();
HTTP
请求
获取主脚本执行的基地址
// Ejemplo: http://example.com/home
Shoyu\HTTP\Request::getBasePath(); // -> "/home"
获取信息协议的名称和版本号
Shoyu\HTTP\Request::getProtocolInfo(); // -> "HTTP/1.1"
获取访问我们站点的协议
Shoyu\HTTP\Request::getProtocol(); // -> "http"
获取服务器主机名
Shoyu\HTTP\Request::getHostname();
获取服务器使用的端口
Shoyu\HTTP\Request::getPort();
获取站点URL
// URL: "http://example.com/home"
Shoyu\HTTP\Request::getSiteURL(); // -> "http://example.com"
获取当前请求的完整URL
Shoyu\HTTP\Request::getAbsoluteURL();
// -> "http://example.com/products/umbrellas/?order=price&dir=desc"
获取当前请求URL的查询字符串
Shoyu\HTTP\Request::queryString(); // "category_id=10&order=asc"
解析查询字符串
Shoyu\HTTP\Request::parseQueryString('category_id=10&order=asc');
// -> ["category_id" => "10", "order" => "asc"]
获取查询字符串中的键值
Request::args 允许我们访问查询字符串中的键和值。
// Ejemplo de URL: http://exmaple.com/?a=10&b=11
// Si quisieramos acceder a todas las claves y valores de la query string
Shoyu\HTTP\Request::args(); // -> ["a" => "10", "b" => "11"]
// Obtener un valor mediante una clave específica
Shoyu\HTTP\Request::args('a'); // -> 10
获取表单的键和值
有时我们希望访问用户通过Web表单发送的值,通常是通过HTTP POST方法。 Request::form 允许我们访问所有这些数据。
<h1>Register product</h1>
<form action="/product/register" method="POST">
<p><label>Name:</label> <input type="text" name="name"></p>
<p><label>Description:</label> <input type="text" name="desc"></p>
<p><label>Price:</label> <input type="number" name="price"></p>
<p><input type="submit" value="Create"></p>
</form>
// Obtener todos los datos de un formulario anterior
Shoyu\HTTP\Request::form();
// -> ["name" => "Sombrilla", "desc" => "Una linda sombrilla", "price" => "20.50"]
// Obtener un valor por medio de una clave dada
Shoyu\HTTP\Request::form('name'); // -> "Sombrilla"
响应
重定向
Shoyu\HTTP\Response::redirect('http://example.com/home');
JSON
echo Shoyu\HTTP\Response::json([
'status' => 'success',
'response' => 'Producto creado con éxito'
]);