Так ведь и Ваше NOT IN и моё IS NULL - это проверка на отсутствие. Ну что поделать, если в стандарте SQL операция IS NULL проверяет отсутствие, а IS NOT NULL - наличие значения. :)
Ну так кто мешает в генераторе HTML подгружать эти внешние файлы перевода и простейшей регуляркой менять английские тексты на русские?
Упрощая себе жизнь на этапе генерации HTML ты усложняешь жизнь программистам, использующим современные средства разработки, понимающие параметры документаторов.
А где Вы нашли обратную логику? В том-то и дело, что логика трёх решений абсолютно идентична: выбрать записи из Apartment для которых отсутствуют записи Apartment_Dates на указанную дату.
Разница только в механизмах проверки на отсутствие. И в скорости работы этих механизмов. Которые различаются несравнимо больше, чем мифическое различие между семантически эквивалентными X BETWEEN Y AND Z и X>=Y AND X<=Z.
Правильно, в таблице Apartment_Dates выбираем только то, что ПОПАДАЕТ в заданные дни. А потом посредством WHERE ad.id IS NULL оставляем только те записи Apartment для которые нет связанных записей в Apartment_Dates. Т.е. только те, которые НЕ попадают.
Ну вот, пошли аргументы "сам дурак". :) Очень сомневаюсь, что Вы сами стали разбираться в предложенной мешанине CSS и JS.
Что касается моего опыта, то прежде чем писать собственный JS-слайдер, я сначала попытался найти аналог с нужным функционалом. Потом, когда ничего, удовлетворяющего заказчика-перфекциониста, не нашлось, серьёзно покопался в потрохах нескольких слайдеров - чтобы понять используемые там алгоритмы. И только после этого стал писать собственный вариант.
To @Petroveg. Прежде чем делать самому, имеет смысл посмотреть, как сделано у других. Чтобы не задавать потом вопросы «Почему анимация в хроме тормозит?».
Я дал ссылку на плагин, который много лет используется на огромном количестве сайтов во всём мире. Который полностью реализует нужный тебе функционал и нужную тебе анимацию. Который нормально работает во всех браузерах. И для использования которого не требуется простыня самописного JS-кода.
Смешно то, что до тебя не доходит. Зайди на сайт плагина Fancybox, который в интернете на каждом углу используется ( fancybox.net ) и в разделе Example щёлкни по второй картинке (elastic). После этого взгляни в правом верхнем углу страницы на дату релиза последней версии плагина.
То, что ты пытаешься изобрести, создано много лет назад.
А для получения данных у каждой модели есть множество стандартных методов для простых случаев и придётся писать собственные методы для случаев нестандартный.
Посмотри, как именно сделаны демонстрационные примеры Yii, какой именно код генерирует gii. А уже потом утверждай, что правильно, а что нет.
Я говорю о том, что контроллер должен только вызвать метод delete модели, а уже модель должна решать, что и как удалять. Впихивать дополнительные классы между контроллером и моделью не имеет смысла.
Если же тебе при удалении нужно выполнить какие-то действия, то ты в классе Subtask (который является наследником класса cModel - в прошлом комментарии я немного ошибся) переопределяешь метод метод delete.
И когда ты удаляешь подзадачу, ты делаешь Subtask::model()->delete(), а никак не самописный метод самописного класса. Никаких saveSubtask и deleteSubtask быть не должно.