到底是应该在 Model 里写 function getByEmail 还是在 Controller 里调用->where('email',"1@2.com")?

2017-06-17 13:00:19 +08:00
 wu1990

下面的(伪)代码都基于 Eloquent ORM。

当然不是完全在 Controller 里写,Controller 和 Model 中间还有一层是负责业务的( Service/Logic ),调用都在 这一层里。

标题只是为了简单描述

一直往 Model 里写 getByxxx 会导致 Model 的方法越来越多…

有人会说写一个

function getByConds(array $conds) () {
	if(isset($conds['email'])) {
		$query->where('email', $conds['email']);
	}
	if(isset($conds['xxx'])) {
		$query->where('xxx', $conds['xxx']);
	}
	return $query->get();
}

然后再里面判断 ,那这样和 ->where('email',"1@2.com") 还有区别吗,->where 可以理解为当做也是传递条件而已吧?

function ($column1, $column2, $orderColumn, $orderDirection) {
}
// 是不是等同于
$query->where('column1', 'value1')
	->where('column1', 'value2')
	->orderBy('orderColumn', 'desc')
	->get();

我觉得应该在 Model 里写 scope 把常用的查询条件统一管理即可。文档: https://docs.golaravel.com/docs/5.4/eloquent/#local-scopes

Model 里增加:

functoin scopeVisible($query, $userId) {
	return $query->whereRaw('passed = 1 OR user_id = ?', [$userId]);
}
functoin scopeDefaultSort($query) {
	return $query->orderBy('weight', 'desc')->orderBy('update_time', 'desc');
}
// 然后查询的时候:
$query->visible($user->id)->defaultSort();

还有,要不要再 Model 里写 create/add 方法,我觉得在 Service/Logic 层统一处理就可以了,没必要放到 Model 里

<?php
class User
{
	public static function add($email, $nickname, $password) {
		$user = new User();
		$user->email = $email;
		// ...
		$user->save();
	}
}
User::add('email', 'nickname', 'password');

或者动态方法……

class User
{
	public function add($email, $nickname, $password) {
		$this->email = $email;
		// ...
		$this->save();
	}
}
$user = new User();
$user->add('email', 'nickname', 'password');

不知道大家怎了理解的…

4303 次点击
所在节点    PHP
27 条回复
Immortal
2017-06-17 17:30:53 +08:00
@neoblackcap 非常感谢
hwding
2017-06-17 18:18:12 +08:00
我也同意新建一个 service 层,组合简单的数据层语句封装起来,对业务层提供更好的封装。
wdlth
2017-06-17 19:01:04 +08:00
拿 Symfony 来说,可以写在一个类中,变成 Service,在控制器中使用。
AlwaysBee
2017-06-18 09:51:44 +08:00
service+1,注入到 controller
meanmachine
2017-06-18 14:26:52 +08:00
可否把简单 sql 逻辑扔 model, 复杂一点的用 repository
owenliang
2017-06-18 16:05:32 +08:00
再做一个 service 层,把 ORM 调用封装成 API,这样不同的 controller 可以实现复用。

另外,对 controller 来说,这样只需要组合不同的 service 实现业务,其实也是进一步简化工程复杂度。
yaxin
2017-06-18 21:49:08 +08:00
如果考虑到之后更改字段或者返回数据处理,还是放 model 处理。我现在就是这样处理的。

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

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

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

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

© 2021 V2EX