Задать вопрос
LittleFatNinja
@LittleFatNinja
горе девелопер, любитель лютой садомии

Как разобратся с MVC?

Помогите разобратся c MVC
уже несколько дней не могу сдвинутся с места, читал статьи, смотрел схемы

допустим нужно сделать страницу с коментариями
Суть вопроса:
как правильно реализовать модель используя ActiveRecord? (орм понимаю как работает)
должен же быть 1 контролер и одна модель, которая наследуется от AR, НО согласно паттерну AR 1 экземпляр - 1 запись таблицы, а нам нужны все записи, но модель мы создали только одну

Извините за плохую формулировку вопроса
Помогите собрать эту всю кухню в кучу
  • Вопрос задан
  • 1021 просмотр
Подписаться 4 Оценить Комментировать
Решения вопроса 3
@newpy
web-dev
В представлении AR
Model = Таблица
экземпляр Model = запись из таблицы,
что мешает получать записи по одной в цикле из нужной таблицы и записывать в массив. На выходе получается массив или коллекция. Собственно современные ORM это и делают.

Например получение всех записей из таблицы категорий (модель Categories) в большинстве современных фреймворков выглядит примерно так:

$categories = Categories::all()

На выходе в переменной $categories получаем коллекцию (по сути массив каждый элемент которого является объектом модели Categories):

Collection {#168 ▼
  #items: array:5 [▼
    0 => Categories {#169 ▶}
    1 => Categories {#170 ▶}
    2 => Categories {#171 ▶}
    3 => Categories {#172 ▶}
    4 => Categories {#173 ▶}
  ]
}


Вы можете пробежаться по этому массиву и получить нужную запись. Никаких проблем.

Утрированно:

Controller - управляет.

Если это Посты, то ими надо управлять, действовать. Методы (actions, действия) работы с Постами, например create, delete, update, edit. Логично было бы предположить что для управления Постами нужен PostsController.

Комментарии - свой набор действий (action) логично предположить что для них следовало бы сделать отдельный контроллер CommentsController, который содержал бы логику управления только Комментариями, а не всем на свете(например Пользователями). Вы всегда будете знать что Комментариями управляет CommentsController, Постами - PostsController. Более того, если кто-то другой откроет ваш код, то он сделает логичное предположение, что за Посты у вас отвечает PostsController и начнет работать/ломать оттуда.

Не зацикливайтесь сильно на теории. Пишите код, и чаще выводите var_dump()-ом промежуточные результаты, вы будете видеть как устроено данные, и начнете понимать как к ним подобраться.

Создайте объект класса (Модели), сделайте запрос, выведите дампом и посмотрите как устроены данные. Вы наглядно увидите объект это или массив, или ни то, ни другое, ни третье )).
Ответ написан
Комментировать
1) У вас должна быть таблица, в которой вы храните комментарии.
2) Создайте ОДНУ модель Comment. Она будет относится к таблице Комментарии. Лучше, сгенерируйте модель через gii - будет понятнее. Обратите внимание, что у модели будет метод tableName(). Он показывает, что один класс отностится к одной таблице.
3) Сделайте view, которая показывает все строки таблицы и view, которая показыает конкретную запись таблицы. Итого две вью.
4) Сделайте контроллер, который будет отвечать за ведение комментариев. В контроллере будут экшены, которые будут отвечать за разные действия с комментариями - один для добавления, один для удаления, один для показа всех, один для показа конкретного.
Ответ написан
Комментировать
copist
@copist
Empower people to give
1. создай таблицу в базе (например, book)
CREATE TABLE tbl_post (
    id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    title VARCHAR(128) NOT NULL,
    content TEXT NOT NULL,
    create_time INTEGER NOT NULL
);


2. с помощью gii создай модель
class Post extends CActiveRecord
{
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }
 
    public function tableName()
    {
        return 'tbl_post';
    }
}

3. Отдельная запись
$post  = Post::model()->findPk(123); // одна статья по идентификатору

4. Много записей
$posts  = Post::model()->findAll(array('order'=>'create_time')); // все статьи в порядке убывания даты публикации


Мануалы с примерами
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@vdl_moskau
Web-developer, Java-developer
Стоит посмотреть на это так:

Есть несколько страниц, страница - модель.

Есть комментарии, связаны со страницей отношением один-ко-многим(has_many в терминах RoR). То есть одна страница - N комментариев.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы