Фреймворки

Adelf

Administrator
Команда форума
Вот когда начнешь понимать что не модель за таблицей закреплена, а таблица за моделью, тогда уже будет неплохо.
 

fixxxer

К.О.
Партнер клуба
Вот из Ваших слов я понял следующее: у каждой таблицы с которой мы собираемся работать, есть своя модель ? Где как раз таки описываются свойства (из ларавела понял еще то, что данные которые пользователю не нужны ставят приватными) и методы, чтобы получить данные с этой таблицы, обновить, удалить и т.д. ?
Наоборот. Начинаем с моделей. А свойства моделей уже ставятся в соответствие таблицам и полям в базе данных.

Недавно мне коротко написали: Модели: Обращение к базе данных обмен данными с базой
Это то самое типичное распространенное заблуждение. :)

PHP:
Class Chat extends Model {
// функции, получить все сообщения, по отдельности, удаление и т.д.. в общем то что нам нужно
  public function getAll() {
    return select('select * from chat');
  }
}
А в этом случае в Model обычные методы вроде public function select($query) {
return mysqli_query($this->link, $query);
}
---
что то я уже сам запутался. я просмотрел столько уроков, задавал на тостере, форумах столько вопросов
Нет.
Если мы делаем ActiveRecord вручную, через sql запросы, то модель заполняем сама себя результатами выборки. Скажем, чат имеет ID и название. Тогда если ручками - как-то так:

PHP:
class Chat {

    private $id;
    private $name;

    public function __construct($name, $id = null) {
        $this->name = $name;
        $this->id = $id;
    }

    public function getId() {
        return $this->id;
    }

    public function getName() {
         return $this->name;
    }
    
    public function rename($newName) {
        $this->name = $newName;
    }

    # выше была чистая модель, теперь, поскольку мы делаем ActiveRecord, в нее же дописываем работу с базой:

    public function store() {
        if ($this->id) {
            DB::query('UPDATE chats SET name=? WHERE id=?', $this->name, $this->id);
        } else {
            DB::query('INSERT INTO chats (name) VALUES (?)', $this->name);
            $this->id = DB::getLastInsertId();
        }
    }

    public static function findById($id)
         $row = DB::fetchRow("SELECT id, name FROM chats WHERE id=?", $id);
         if (!$row) {
             throw new ModelNotFoundException(__CLASS__);
         }
         return new self($row['name'], $row['id']);
    }

}
DB:: тут специально пишу статическим вызовом, чтобы не думать о том, откуда возьмется соединение с базой - это для понимания принципа несущественно.

В Eloquent работа с базой сделана на уровне фреймворка, и sql-запросы и подобные методы вручную писать не требуется.
 

Adelf

Administrator
Команда форума
Попробую пояснить, чтобы человек понял.
Вот ты начинаешь делать сайт. у тебя появляется мысль, что там должны быть пользователи. Соответственно, родилась модель User(вообще говоря не модель, а доменный объект, но пофиг). Потом мы продолжаем моделировать, т.е. описывать нашу задачу объектным языком чтоли. Появляются объекты Post, Comment и связи между ними(что каждый Post должен иметь автора типа User и он может иметь много Comment). О таблицах и прочее мы пока даже не думаем. И только когда задумываемся как их хранить, появляются таблицы. Все эти Active Record технологии позволяют очень удобно делать такие приложения, но немного мешают правильному восприятию.
 
Последнее редактирование:

WMix

герр M:)ller
Партнер клуба
че в игры не играл? Сохранись! И не говори что актив-рекорд о другом. Восприятие правильная, разделение задачь кривое.
 

A1x

Новичок
О, раз пошла такая пьянка - чем отличается Модель от DTO ?
 

Adelf

Administrator
Команда форума
Модель предметной области = Domain
То, что корневые DTO классы называют Model, тебя не должно путать
 

MiksIr

miksir@home:~$
Я бы вот спросил, чем DTO отличается от анемичной модели ;)
 

A1x

Новичок
Модель предметной области = Domain
То, что корневые DTO классы называют Model, тебя не должно путать
ну наверно можно сказать что DTO это анемичная модель некоторой сущности
а та Модель которая Domain может включать в себя несколько сущностей, а значит и моделей
то есть это как бы составная модель
 

Adelf

Administrator
Команда форума
Для составной "модели" есть понятие агрегат.

Все все понимают, но все равно чего то обсуждают :)
 

A1x

Новичок
Я бы вот спросил, чем DTO отличается от анемичной модели ;)
я вот подумал почему иногда возникаетет путаница - потому что такие понятия как DTO и модель вообще нельзя ставить в один ряд
модель это отношение между неким элементом множества программных сущностей и элементом множества сущностей реального мира
т.е. программная сущность DTO моделирует какую-то реальную сущность - анкету или там отчет

например Вася друг Пети, в то же время Вася - человек, и спросить чем DTO отличается от модели -
это все равно что спросить кто же такой Вася, человек или друг? Чем друг отличается от человека?
Нельзя так ставить ворос потому что Вася это сущность типа человек, а друг - отношение

Хотя может это только у меня путаница, а тут все все понимают :)
 

Вурдалак

Продвинутый новичок
Модель — это:

1. Идеализированное представление об объекте реального мира, сохраняющее свойства и поведение этого объекта, важные для данного контекста (пользователь, электронный адрес, политика доступа).
2. Программная сущность, которая является отражением этого объекта (class User, class Email, class PermissionPolicy).
3. Совокупность объектов, отражающих множество понятий и связей между ними в какой-то предметной области === концептуальная модель (модель интернет магазина, модель facebook.com, etc.).

DTO — это не модель, это просто структура данных.
Анемичная модель — это не модель.
class User extends Model { public $id; public $name; } — это не модель.
Но это часто называют моделью, потому что так написано в документации Eloquent, Doctrine, etc. Мы просто пользуемся языком, который предлагает конкретный инструмент.

Модель должна содержать поведение. setName(), getName() — это не поведение. Это технический мусор.
 

MiksIr

miksir@home:~$
@Вурдалак, ну так я правильно понимаю, что анемичная модель - это вырождение модели в DTO? Или же они отличаются наличием аксессоров и мутаторов?
 

fixxxer

К.О.
Партнер клуба
Кмк, это не самый удачный топик, чтобы обсуждать такие темы. ТС-у бы таблицу умножения изучить, а вы тут ТФКП обсуждаете. ;)

Для начала ему бы понять, что не надо таскать массивы с данными по всему коду в процедурном стиле. А уже потом будет вопрос, где писать бизнес-логику.
 
Последнее редактирование:

AnrDaemon

Продвинутый новичок
Все все понимают, но все равно чего то обсуждают :)
"Як цуцик, усё розумиє, тильки не розмовляє…" (Сори за мой французкий, угу.)
А если серьёзно, то понимать - это одно, я уметь доступным и простым языком донести это до собеседника - совсем другое.
Я вот тоже понимаю "как надо", но всегда с большим интересом читаю ваши дискуссии, потому что
1. Понимать - не значит знать. Когда нет осознанного знания, не за что ухватиться даже в собственном мозгу. Про донесение мысли до собеседника (или, тем паче, оппонента) речь тем более не идёт.
2. Терминология - основа общения. Не понимая значений слов, невозможно понять собеседника. Честно скажу, мой личный словарик хромает.
 

Adelf

Administrator
Команда форума
Нормальный. Но термины устоявшиеся то на английском. Там перевели так, в другом не так. Проще все-таки просто юзать английские варианты.
 
Сверху