假设我有两个模型:
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_id
或 book_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/