PHP:重构为面向对象——如何对连接建模

标签 php oop model-view-controller join

假设我有两个模型:

class Book
{
    public $book_id;
    public $book_author_id;
    public $title;
}

class Author
{
    public $author_id;
    public $author_name;
}

我习惯这样写:

$DB->query("SELECT book_id, title, author_name 
            FROM book 
            LEFT JOIN author 
                ON book_author_id = author_id
           ");

假设我对针对此关联进行单独查询不感兴趣。我该如何进行?以下是我听说过的一些事情:

  • 创建 JOIN 的 MySQL View
  • 创建 View 的模型类

我正在处理的应用程序涉及数十个表,并且在过程代码中进行了高度优化(例如,几乎没有 SELECT * 任何地方)。我正在重构以使其更易于维护(我也是原始创建者),但我希望在不影响文件和数据库调用结构的情况下在需要时灵活地使用连接。

我有一个可能相关的问题与包含其他模型有关:

class Author
{
    public $author_id;
    public $author_name;

    /* @var Book */ //<--don't really fully understand this but I've seen something like it somewhere
    public (array) $authors_books;
}

我仍在寻找答案,但如果您能按我的方式发送链接,我们将不胜感激。

最佳答案

你所说的“模型”实际上是domain objects .他们应该负责处理域业务逻辑,与存储无关。

与存储相关的逻辑和交互应由单独的对象组处理。最明智的解决方案之一是使用 data mappers .每个映射器可以处理多个表和复杂的 SQL。

对于您的查询,此类查询的结果将包含适合传递给域对象集合的信息。

顺便说一句,该查询非常无用。您忘记了每本书可以有多个作者。以this book为例- 它有 4 位不同的作者。要使此查询有用,您必须根据 author_idbook_id 执行 GROUP_CONCAT()

当实现这样的 JOIN 语句时,数据库响应很可能是一个集合:

$mapper = $factory->buildMapper('BookCollection');
$collection = $factory->buildCollection('Book');

$collection->setSomeCondition('foobar');
$mapper->fetch( $collection );
foreach ( $collection as $item )
{
    $item->setSomething('marker');
}
$mapper->store( $collection );

P.S. 您的代码示例似乎在泄漏抽象。让其他结构直接访问对象的变量是一种不好的做法。

P.P.S.看来你对MVC模型部分的理解和how i see it大不相同| .

关于PHP:重构为面向对象——如何对连接建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11512522/

相关文章:

c++ - 程序控制 : Menu Selectable Subprograms

java - Java 11 中使用泛型进行未经检查的方法 'sort(List<T>)' 调用

MVC 5 应用程序中的 CSS 问题

php - 在 JavaScript 函数中使用 FORM POST

php - mysql。限制 $x1、$x2。是否可以限制 $x2, $x1?

javascript - SilverStripe - JavaScript 变量未通过 AJAX 成功发送到 Page.php

oop - 我如何用看似无目标的想法构建面向对象的软件?

laravel - 如何使用 Laravel 4 上传视频?

asp.net-mvc-3 - 如何为 View 模型属性创建自定义比较属性

php - 500 内部服务器错误...特定于浏览器?