使用 Laravel ORM 时的一个问题?

2016-08-12 08:45:13 +08:00
 chenset

我们团队使用 ORM 写了两个例子, 争论这两个例子的优缺点. 麻烦帮忙分析一下.

问题: 需要取得用户的所有车辆, 这个方法应该写在 User 中还是 Car 中.

表结构: user: [ id, ]

car: [ id, user_id, car_status, ]

Laravel ORM 代码:

<?php
class User extends \Illuminate\Database\Eloquent\Model
{
    // 例子 1: 将取用户所有车辆的方法写在 User 中, user ID 参数使用$this->id
    // 例子 1 的理由是: 因为要取得用户的所属车辆, 出发点是 User 对象所以方法应该写在 User 中, 这样会更加面向对象.
    public function myCars()
    {
        return Car::where(['user_id' => $this->id, 'car_status' => 1])->get();
    }
}

class Car extends \Illuminate\Database\Eloquent\Model
{
    // 例子 2: 将取用户所有车辆的方法写在 Car 中, user ID 参数使用通过方法传递进来
    // 例子 2 的理由是: 因为所查询的是 Car 表, user ID 应该作为 Car 的一个属性传递给 Car.list 方法,而且$moreCondition 可以日后增加更多筛选条件复用性好.
    public function list(int $userID, $moreCondition...)
    {
        return $this->where(['user_id' => $userID, $moreCondition...])->get();
    }
}

不使用关联关系不手写 SQL 时, 我们团队在争论这两种写法的优劣, 想看看大家的看法.

例子 1: 将取用户所有车辆的方法写在 User 中, user ID 参数使用$this->id 例子 1 的理由是: 因为要取得用户的所属车辆, 出发点是 User 对象所以方法应该写在 User 中, 这样会更加面向对象.

例子 2: 将取用户所有车辆的方法写在 Car 中, user ID 参数使用通过方法传递进来 例子 2 的理由是: 因为所查询的是 Car 表, user ID 应该作为 Car 的一个属性传递给 Car.list 方法,而且$moreCondition 可以日后增加更多筛选条件复用性好.

主要想问的是这个方法应该写在 User 中还是 Car 中.

6013 次点击
所在节点    PHP
45 条回复
HanSonJ
2016-08-12 08:54:19 +08:00
我会写到一个 service 上而不是 model 上。。。
chenset
2016-08-12 08:57:01 +08:00
@HanSonJ 哎呀, 不要歪楼拉. 一个方法也写 server 吗 ? 我们其实也有 repo. 但是只是想讨论这个例子中的问题而已.
lxrmido
2016-08-12 08:58:30 +08:00
其实哪怕不是 ORM ,我也经常遇到这类问题:

“获取某个用户组下的用户列表” 该写在 User 模块里还是 UserGroup 模块里呢……
justfindu
2016-08-12 09:00:07 +08:00
不用 belongs 或者 hasMany 进行关联么~
hisway
2016-08-12 09:00:20 +08:00
$this->hasMany(Car)
keikeizhang
2016-08-12 09:02:50 +08:00
class PictureController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index(Request $req)
{
$user = $req->user();
$dealer = $user->dealer;
$picture = Picture::orderBy('id','desc')->where('dealer','=',$dealer)->get();
return view('picture.index', compact('picture'));
}
}

取出一个用户拥有的所有图片...
phpcxy
2016-08-12 09:03:01 +08:00
第一个查询出 $user 后,再$user->myCars()就能取得数据啦。
hisway
2016-08-12 09:03:02 +08:00
@hisway User::find(1)->Car
chenset
2016-08-12 09:09:03 +08:00
能实现的方式很多拉 . 但是主要想问的还是这个方法应该写在 User 中还是 Car 中.
chenset
2016-08-12 09:09:25 +08:00
@lxrmido 对对, 结果呢 ? 谁打赢了 ?
inmyfree
2016-08-12 09:10:04 +08:00
写到 Car 里面,然后在 User 添加一个 carList 方法,里面调用 Car.list,完事
inmyfree
2016-08-12 09:10:33 +08:00
ps : android 写多了看出 OOM 了,哎
gearh
2016-08-12 09:11:58 +08:00
没有 ORM 时写在 user 中,用 ORM 直接关联啊,关联!
freefcw
2016-08-12 09:14:20 +08:00
必须第一种撒。。第二种还自己去折腾,关键代码读起来 shi 一样不连贯
tabris17
2016-08-12 09:16:17 +08:00
写在 User 里,这是个 hasMany 的关系
sujin190
2016-08-12 09:16:24 +08:00
重点是当和用户相关的数据越来越多的时候用户 model 里岂不是越来越多方法,每个细分功能都会修改 user model ,这样不合适吧,除非所有细分功能共用,否则最好还是写到各自 model 里比较好
solaya
2016-08-12 09:22:16 +08:00
不是用 hsaMany belongsTo ???
jiujianlu
2016-08-12 09:23:19 +08:00
使用第一种,将来使用关联关系重构的时候,改动比较小。
chenset
2016-08-12 09:25:29 +08:00
@sujin190 那么你是支持哪一种?
freefcw
2016-08-12 09:26:22 +08:00
说错了。。。 Laravel 自带的 Relation 就是极好的,没必要这么折腾

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/298782

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX