【问题标题】:Loading multiple rows from a model? (PHP, MySql)从模型中加载多行? (PHP,MySql)
【发布时间】:2019-04-10 17:02:04
【问题描述】:

我不完全了解 MVC 模型的一件事是从模型中加载多个数据表。

假设我们有一个名为 user 的模型。


public class User{

protected $username; 
protected $email;
protected $id;

public function setUsername($name, $id) { 
$db->set->name($name)
$db->set->id($id)

} 

public function getUsernameById($id) { 
return $db->get->name($id); 

} 

据我所知,模型相当于数据库中的一行(称为用户)。

现在我写了两个函数。第一个用于设置用户名,另一个用于通过ID检索用户名。

假设您要检索所有用户。假设通过getAllUsers() 方法。此方法不适合模型,因为它不是单个对象。

现在我明白了,例如,您可以在控制器本身中调用此方法(函数)。但是在哪里可以定义这个方法(函数)呢?由于您不在模型上执行此操作。

如果我错了,我也喜欢听 :)

【问题讨论】:

  • 您通常将它们实现为类方法。查看其他现有 ORM 的设计,例如 RedBeanPHPDoctrinePropelEloquent
  • 您想实现类似 ORM 的解决方案 - 您的 models 会尝试镜像特定的数据库表结构和约束吗?或者您是否正在尝试构建能够在其方法中直接执行 sql 查询的对象(您的 模型)?
  • 嘿达基斯。谢谢你的评论。我更关心创建 MVC 模型(并将其链接到 MySql 或其他数据库)背后的想法。当我去看 laravel 时,你已经雄辩地解决了你的大部分问题。太好了,假设您自己设置了一个 MVC 模型,因此了解其背后的逻辑很有用(我仍然有点卡住)。
  • 不客气。对不起,但你的第二和第三个短语让我有点困惑,因为我不是以英语为母语的人。从他们那里,我了解到您想要实现一个“经典”模型层,而不是类似 ORM 并且根本不使用 ORM 库。就像我在之前评论的第二个问题中问的那样。我对吗? P.S.:通常,您必须在特定用户名前加上“@”字符(例如:@dakis),以便 SO 用户收到有关您的评论的通知。
  • @dakis 嗯,是的,我更喜欢它,因为我想更好地理解它背后的逻辑。当你看 laravel 的时候,很多事情都替你做了。是的,我想在没有 ORM 的情况下做到这一点,可能最后。是否有非常简单(不可靠)框架的示例,以便我可以更好地了解结构?

标签: php mysql activerecord


【解决方案1】:

基本上你的定义是正确的:

模型对象保存数据并定义操作逻辑 数据。例如,Basic 示例应用程序中的 Student 对象是 一个模型对象。它包含描述有关对象的事实的数据,例如 学生的名字和姓氏,并具有可以访问的方法 并更改此数据(getter 和 setter)。模型对象不是 直接显示。它们通常是可重用的、分布式的、持久的 并可移植到各种平台。

(来自:http://best-practice-software-engineering.ifs.tuwien.ac.at/patterns/mvc.html

那么,如果您不只是将getAllUsers() 函数放入模型中,那么该函数应该放在哪里呢?

首先,当我们谈论“模型”一词时,我们并不总是指模型。在 MVC 中,模型 (M) 包含所有业务逻辑。这意味着它包含 领域模型,这是您在此问题中所指的模型。但它也包含服务层

服务层通常由各种提供功能的类组成,例如getAllUsers()getAllUsersWhichOwnAGreenTruck()

这是一个很好的图表展示了这一点:

(来源:Domain Model and Service Layer patterns in P of EAA

在现代应用程序中,例如使用 Laravel PHP 框架构建,您通常会自动生成数据库以及模型和数据库映射/通信(示例 Eloquent ORM:https://laravel.com/docs/5.8/eloquent)。但是您开始在服务层内实现复杂的应用程序逻辑。

【讨论】:

  • 谢谢@blackbam 的回复:),PHP 中是否有一个非常简单的功能示例?
  • 类似的很详细的第一个答案:stackoverflow.com/questions/5863870/…
  • Ans 基本上你可以简单地在用户“上方”添加一个 UserService 类,然后就可以了,酒窝示例 :-)
  • @tereško Modern 是一个相对术语,也可以称为 Symfony 现代或电力现代 ^^ 虽然我不认为 Laravel 项目是不可维护的,您认为哪个 PHP 框架值得推荐?
猜你喜欢
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
相关资源
最近更新 更多