ООП, отображающий две таблицы — два объекта? Или один объект, который знает больше, чем должен?

У меня есть две таблицы, A и B. Большая часть моих данных поступает из таблицы A, но мне также необходимо убедиться, что некоторая информация (адрес и адрес электронной почты) такая же, как в таблице B. Я могу получить доступ к этой информации с помощью запроса ,

select a.address, a.email, b.address, b.email from a, left join b on a.uniqueAttr=b.uniqueAttr

Я пытаюсь делать вещи ООП способом, но я изо всех сил пытался выяснить, где это вписывается в общую схему, потому что объект A действительно не должен заботиться об информации в таблице B.

Моя первая идея — сделать что-то вроде этого псевдокода:

<?php
// list view
$a = new aList;
$rows = $a->findAll();
for($i=0; $i<sizeof($rows); $i++) {
$b = new bList;
$foreignRow = $b->find($row->foreignKey);

// do something with the info
if($foreignRow->address != $a->address) { $error = 'address'; }

// do template stuff...
}

Но если я сделаю это так,

  1. Мне придется делать новый запрос в b каждый раз, когда я перебираю список, сгенерированный a. Это не очень эффективно, особенно если список становится длинным (хотя я планирую реализовать нумерацию страниц).
  2. Это все еще пахнет процедурным программированием, потому что я должен быть в состоянии проверить $someObject->isAddressSame()

Другой вариант, который я вижу, это

  1. Добавьте метод к объекту A, который слева присоединяется к таблице B (если нет соответствующей записи) и возвращает список, включающий атрибуты таблицы B.
  2. Реализуйте другой метод, который проверяет, совпадают ли адреса.

псевдокод:

<?php
// list view
$a = new aList;
$rows = $a->findAllWithTableB();
for($i=0; $i<sizeof($rows); $i++) {
$error = $a->isAddressSame($row);
// do other view stuff
}

Но похоже, что это повторяет ->findAll() метод), и объект ObjectA знает о таблице B то, что он, вероятно, не должен знать.

Я слишком параноидален из-за того, как много объектов знает А?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]