Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
3 / 3 / 2
Регистрация: 05.01.2013
Сообщений: 264

Проверка существования привязанного родителя

27.02.2017, 16:13. Показов 851. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Например, есть класс Image он содержит инфу о картинке, ID родительского объекта, к которому привязан и тип родительского объекта. Например, есть статьи и комментарии к ним, оба могут содержать картинки, но так как статьи и комментарии это две разных таблицы в БД, то и айдишники у них отдельные, поэтому в таблицу Image нужно еще добавить поле "type" которое будет указывать на то к статье или к комменту привязана картинка.
Это вообще правильная реализация или нужно как-то иначе?
Так вот, в таком случае вылезает проблема, при загрузке картинок будет примерно такой код:
PHP
1
2
3
4
5
if( $type == 'article' ) {
\models\article::find()->поиск статьи по айдишнику
}else if( $type == 'comment' ) {
\models\comment::find()->поиск коммента по айдишнику
}
А если объектов, к которым может быть привязана картинка куча, то и условий будет куча с повторяющимся кодом, ибо там дальше разные проверки и return false если не найдено.
Можно ли в принципе обойтись без подобной конструкции или это нормальная конструкция и от нее никуда не уйти?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.02.2017, 16:13
Ответы с готовыми решениями:

Проверка на существования ID
Всем привет !!! :) У меня такой вопрос можно ли вообще проверить в PHP существует ли определенный ID в базе данных ? То есть у меня...

Проверка существования дирректории
Здравствуйте.Нужно создать папку.Если пишу @mkdir(PATH.'/images/catalog/'.$inUser->id.'/'); создаётся, но не могу проверить.Пробую и так ...

Проверка существования переменной
form.php <form action="otvet.php" method="post"> <table border="3"> <tr> <td> <?php echo '<input type="text"...

4
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
27.02.2017, 16:34
Цитата Сообщение от PhpNewbie Посмотреть сообщение
Это вообще правильная реализация или нужно как-то иначе?
Правильная. Полиморфная связь называется.
Цитата Сообщение от PhpNewbie Посмотреть сообщение
при загрузке картинок будет примерно такой код
При какой загрузке? И чем обусловлен запрос к родителю, в данном случае?
0
3 / 3 / 2
Регистрация: 05.01.2013
Сообщений: 264
28.02.2017, 15:29  [ТС]
При загрузке картинок через загрузчик, они же привязываются к комменту или статье, но сперва проверяется существует ли такая статья или коммент с нужным автором и параметрами, если да, то загрузка происходит, если нет, то ретурн фальсе. Суть в то, что в зависимости от типа приходится копипастить код и строить if else if, мне это не нравится, но я не знаю, как сделать иначе.
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
28.02.2017, 16:17
Цитата Сообщение от PhpNewbie Посмотреть сообщение
При загрузке картинок через загрузчик
А, вот как. Я почему-то подумал, при выводе на экран эта проверка выполняется.

А валидатора нет, так понимаю? Вручную проверяете введённые данные?
В общем, самый простой вариант. Класс Image дополняете так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
class Image
{
    protected static $relations = [
        'article' => Article::class,
        'comment' => Comment::class,
    ];
    
    public static function getImageable($name)
    {
        return self::$relations[$name] ?? false; // Двойной вопрос работает только в PHP 7
    }
}
А затем это:
PHP
1
2
3
4
5
if( $type == 'article' ) {
\models\article::find()->поиск статьи по айдишнику
}else if( $type == 'comment' ) {
\models\comment::find()->поиск коммента по айдишнику
}
Заменяете на
PHP
1
2
3
4
5
if ($class = Image::getImageable($type)) {
    $class::find(...); // Проверка по ID
} else {
    // Тип не найден
}
В итоге, при добавлении новых типов, нужно будет дополнить массив Images::$relations.
1
3 / 3 / 2
Регистрация: 05.01.2013
Сообщений: 264
28.02.2017, 16:44  [ТС]
Да, неплохо, как раз именно то, что я и хотел, но не знал как грамотно реализовать.
Но часто бывает такое, что после поиска по айди статьи или коммента нужно выполнить еще кое-какие проверки, например проверить является ли статья editable, но у коммента такого поля нету, можно, конечно просто написать:
PHP
1
if( $row->editable == 1 && $row->author_id == $current_userid )
Код в принципе выполнится, но не всегда это норм.
Я так понимаю, что в таком случае нужно к каждой модели article и comment добавить какую-нит функцию типа isUploadablepics и уже в ней проверять можно ли загрузить картинку с такими параметрами или нельзя. Или эту функцию лучше привязать к классу image как-то в качестве валидатора?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.02.2017, 16:44
Помогаю со студенческими работами здесь

Проверка существования сессии
Есть некая задача. Есть на сервере папка с временными файлами temp_dir, в ней помещаются файлы пользователя на некоторое время, например...

Проверка существования файла или изображения
Нужно проверить существование файла. Сейчас проверяю есть ли изображение, а нужно любой файл, но именно с этим именем if...

Проверка существования картинки на сервере
всем привет! в ответ на мой запрос через некое API приходит ответ с нужными мне параметрами. среди параметров есть такой - краткое...

Проверка существования передаваемых данных
Здравствуйте. Пните в нужную сторону, где я ошибаюсь бд -- Структура таблицы `c_user` -- CREATE TABLE `c_user` ( `id`...

Проверка существования строки в файле
Пытаюсь устроить простейшую проверку инвайта, они хранятся просто в тхт файле я не пойму как выполнить проверку существования переданной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru