下面的(伪)代码都基于 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');
不知道大家怎了理解的…
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.