как более выгодно написать это?

Духовность™

Продвинутый новичок
как более выгодно написать это?

PHP:
/**
 * Удаляет одну запись из таблицы по идентификатору
 * 
 * @access public
 * @param ?
 * @return int количество удаленных рядов
 */
public function deleteById($id) { /*...*/}
Вызов будет такой:
PHP:
$mapper->deleteById($object->id);
Подумалось, а может лучше предавать объект и непосредственно в методе писать:
PHP:
public function deleteById($object)
{
    $this->db->query('DELETE FROM table WHERE id = ?',  $object->id); 
}
Но вдруг придется удалить запись без создания объекта?
Как думаете, что лучше?

-~{}~ 02.03.10 16:37:

Осенило. Может так?

deleteByObjectId($object) - удаляет по ID объекта
deleteById($id) - удаляет по ID
 

Бочонок

http://frontender.info
deleteById($id)

Совершенно незачем делать зависимыми класс, в котором deleteBy и класс, к которому принадлежит object
 

Духовность™

Продвинутый новичок
$object - это объект у которого есть ID свойство и который является в большинстве случаев объектным представлением одной строки таблицы.

-~{}~ 02.03.10 16:41:

Совершенно незачем делать зависимыми класс, в котором deleteBy и класс, к которому принадлежит object
ещё раз
 

Бочонок

http://frontender.info
2triumvirat
Аргументом deleteBy должно быть ID.
Если ты будешь требовать в качестве аргумента объект, который представляет собой одну строку таблицы, то ты обяжешь себя создавать этот объект каждый раз, когда хочешь чего то удалить. Тоесть у тебя класс, содержащий твой deleteBy не будет работать без класса, содержащего объект-представление строки.
Иногда это имеет смысл.
Но в данном случае ты из этого объекта берешь все тот же числовой ID и все. Больше ничего.
Какой смысл тогда в этом?
Лучше передать ID и никак не зависить от класса, к которому пренадлежит object.

-~{}~ 02.03.10 16:50:

Например какой смысл создавать $object если тебе ID передан пользователем?
 

A1x

Новичок
сразу вспоминается перегрузка методов в джаве
я делал так иногда чтоб долго не думать
PHP:
public function delete($objId) {
    if (is_object($objId)) {
        $objId = $objId->getId();
    }
    ....
}
 

Духовность™

Продвинутый новичок
Например какой смысл создавать $object если тебе ID передан пользователем?
Например, что бы проверить существование этого строки\объекта с этим ID и вывести птом какую-то информацию, мол Вася пупкин удален из системы.
 

fixxxer

К.О.
Партнер клуба
А. Ну я как то так делаю:

PHP:
interface Item_Interface {
    public function loadById($id);
// ...
}

class MyObject extends Storage implements Item_Interface {
    /* Storage ~= ArrayObject */

    protected
        $Model = null;

    public function loadById($id) {
        $this->getModel()->loadById($id);
    }

    public function delete() {
        $this->ensureIsLoaded();
        $this->getModel()->deleteById($this->id); /* а надо ли проверять?*/
        $this->clear();
    }

    protected function ensureIsLoaded() {
        if (!$this->has('id')) {
            throw new LogicException('Not loaded');
        }
    }

    protected function getModel() {
        if (null === $this->Model) {
            $this->assembleModel();
        }
        return $this->Model;
    }

    protected function assembleModel() {
        $this->Model = new MyModel($this);
    }
}

class MyModel /* на самом деле extends Model_AbstractItem но напишу в кучу */ {

    protected $Item;

    public function __construct(Item_Interface $Item) {
        $this->Item = $Item;
    }

    public function loadById($id) {
        $this->Item->replaceWith(
            $this->Db()->getRow(self::$SQL_SELECT_BY_ID, compact('id'))
        );
    }

    public function deleteById($id) {
        $this->Db()->query(self::$SQL_DELETE_BY_ID, compact('id'));
        return $this->Db()->getAffectedRows();
    }

}
 

fixxxer

К.О.
Партнер клуба
Нифига это не здорово, это неявное поведение.

Если такое нужно, следует сделать два метода.
 

Wicked

Новичок
$obj->delete() // когда есть объект
SomePeer::doDelete($criteria) // когда нету объекта или надо удалить много разных
 

A1x

Новичок
triumvirat
реально я сам так сейчас не делаю, лучше как говорит fixxxer - два отдельных метода. Прозрачность кода рулит
 
Сверху