一文读懂 Laravel 模型类与 tp5.0 模型用法
一文读懂 Laravel 模型类与 tp5.0 模型用法
本文编写时间:2023-06-08
需求
想学习两种 ORM 的使用方式,以便遇到哪种框架都能快速实现功能。
代码部分
模型类
// 下面Laravel
class User extends Model
{
protected $table = 'users';
protected $guarded = [];
public function orders()
{
return $this->hasMany(Order::class, 'user_id');
}
}
class Order extends Model
{
protected $table = 'orders';
protected $guarded = [];
public function user()
{
return $this->belongsTo(User::class, 'user_id');
}
}
// 下面tp
class User extends Model
{
protected $table = 'users';
public function orders()
{
return $this->hasMany('Order', 'user_id');// 注意这里,必须字符串。
}
}
class Order extends Model
{
protected $table = 'orders';
public function user()
{
return $this->belongsTo('User', 'user_id');
}
}
查询与集合
// 下面Laravel
$user = User::find(684);
// 单条 的另一种写法
$user = User::where('id',684)->first(); // 注意 first
$order_list = $user->orders()->limit(2)->orderBy('id','desc')->get();//注意排序
echo $order_list instanceof Collection;//1
echo "<br>";
echo $order_list->count();//2
echo "<br>";
echo $order_list->first()->created_at;//2023-02-11 16:08:12
echo "<br>";
// 下面tp5.0
$user = User::find(684);// 也可以 $user = User::get(684);
// 单条 的另一种写法
$user = User::where('id',684)->find(); // 注意find
$order_list = $user->orders()->limit(2)->order('id','desc')->select();//排序。
$order_list = collection($order_list);
echo $order_list instanceof Collection;// 1
echo "<br>";
echo $order_list->count();// 2
echo "<br>";
echo $order_list[0]->created_at;//2023-02-11 16:08:12,没有first方法,
echo "<br>";
模型关联的使用示例。
// 下面Laravel
// 查有路上订单的用户数。
$user_count = User::query()->whereHas('orders',function ($query){
$query->where('delivery_status','on_the_way');
})->count();
echo $user_count. "<br>";//5
// 查订单id小于100 的用户数量。
$user_count = User::query()->whereHas('orders',function ($query){
$query->where('id','<',100);
})->count();
echo $user_count. "<br>";//12
// 下面tp5.0
// 查有路上订单的用户数。
$user_count = User::hasWhere('orders',function ($query){ //方法名 hasWhere
$query->where('delivery_status','on_the_way');
})->count();
echo $user_count. "<br>"; //5
// 查订单id小于100 的用户数量。
$user_count = User::hasWhere('orders',function ($query){
$query->where('Order.id','<',100); // 注意这里的差异,必须带类名。
})->count();
echo $user_count. "<br>";//12
// 新增和删除,感谢上帝,这是一样的。
// 新增。
$order = new Order([
'date'=>time(),
'express_info'=>mt_rand(1,100),
'shipping_type'=>1,
]);
$order->save();
echo $order->id;
$order = Order::find(421);
$order->delete();
下面是模型修改
// 下面laravel。
$order = Order::find(421);
$order->update([
'express_info'=>mt_rand(1,100),
]);
$order->increment('express_info', 10);
echo "<br>" . $order->express_info;
// 下面tp5.0
// 修改。必须save!
$order = Order::find(421);
$order->save([
'express_info'=>mt_rand(1,100),
]);
// 自增,方法名不同。
$order->setInc('express_info', 10);
echo "<br>" . $order->express_info;
下面是静态修改,注意静态,完全一致。
// 下面laravel
Flight::where('active', 1)
->where('destination', 'San Diego')
->update(['delayed' => 1]);
// 下面tp
User::where('id', 1)
->update(['name' => 'thinkphp']);
事务与悲观锁。
// 下面laravel
DB::beginTransaction();
$user = User::lockForUpdate()->find(1);
// 对user处理。。。
// ...
DB::commit(); // 或 DB::rollBack();
// 下面tp
Db::startTrans();
$order = Order::where('id',421)->lock(true)->find(); // 或 $order = Order::lock(true)->find(421);
$order->setInc('express_info', 10);
Db::commit(); // Db::rollback();
总结
- 都很棒,我谁也不得罪
- 完全相同的是模型新增,模型删除,静态修改。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: