一文读懂 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();

总结

  • 都很棒,我谁也不得罪:smirk:
  • 完全相同的是模型新增,模型删除,静态修改。
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 8

Tp为了抄得不太像,把whereHas改成了hasWhere, 但按laravel的风格比如hasOne这样,觉得应该也是hasWhere,但laravel去用了whereHas来区分是代码层面还是数据库层面的,不知道我说的对还是不对。

10个月前 评论
lddtime 10个月前
小学毕业生 (作者) 10个月前

User::class 本身就是字符串

10个月前 评论
yyy123456 (楼主) 2周前

直接像 Hyperf 那样用 Laravel ORM 多好,接触过很多商业 TP 项目,发现它们在模型关系中的 localKey 和 foreignKey 用的都是一模一样的字段

class User
{
    public function orders()
    {
        return $this->hasMany(Order::class, 'user_id', 'user_id');
    }
}

我也不理解这是为什么。

10个月前 评论
Trace92 8个月前

tp风格的go框架 github.com/unti-io/unti

8个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
51
粉丝
7
喜欢
60
收藏
94
排名:588
访问:1.3 万
私信
所有博文
社区赞助商