Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/16: Рейтинг темы: голосов - 16, средняя оценка - 4.94
-9 / 8 / 3
Регистрация: 17.02.2021
Сообщений: 239

Как указывать типы и дефолтные значения при работе с AR моделью?

24.09.2021, 19:18. Показов 3177. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создаю объект AR у которого свойства - это столбцы таблицы БД и пытаюсь выполнить save() - получаю ошибку нельзя обращаться к свойствам у которых нет дефолтного значения )))

Ну так ребята у меня вообще-то дефолтными значениями занимается сам мускул, как я их в PHP задам, у меня же данные будут нарушены, а переписывать дефолтные значения из мускула в класс я не хочу, зачем мне делать двойную работу?

Как быть?

И ещё как мне прописывать типы свойств, чтобы они соответствовали типам столбцов БД (например в PHP нет типа date или decimal)?

Есть мануал какой-нибудь?

p.s. я ещё понимаю если бы в БД запрещено хранить null в столбце а я делаю save(), так по дефолту свойство как бы null то мне бы отлуп был что у меня структура не позволяет null сохранять, а то...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.09.2021, 19:18
Ответы с готовыми решениями:

Беда с моделью в представлениях при работе с MYSQL
Здравствуйте! Возникла следующая проблема при работе с Ентити Фрейморковской моделью базы данных MYSQL. Когда пытаюсь обратиться к данным...

Дефолтные значения не определены, как побороть?
В скрипте почему то всегда this.ModalType неопределенный, как исправить пока что не понимаю. и та же проблема с таймером ...

Неоходимость указывать типы данных в PDO
Здравствуйте, уважаемые. Знакомлюсь с подготовленными запросами в PDO. При этом указание типов параметров не обязательно. Объясните,...

19
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
24.09.2021, 20:39
DefenseMinister, Покажите текст ошибки.
0
-9 / 8 / 3
Регистрация: 17.02.2021
Сообщений: 239
24.09.2021, 20:43  [ТС]
sad67man, нельзя юзать свойство до инициализации

Добавлено через 2 минуты
sad67man,

PHP
1
2
3
4
5
6
7
8
class Test extends Model
{
    public $login;
}
 
$test = new Test();
$test->login = 'Test';
$test->save();
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
24.09.2021, 20:52
Лучший ответ Сообщение было отмечено DefenseMinister как решение

Решение

Цитата Сообщение от DefenseMinister Посмотреть сообщение
нельзя юзать свойство до инициализаци
Меня интересует оригинальный текст, потому что вы можете неточно его интерпретировать.

В общем php8 выкидывает ошибку при попытке обратиться к непроинициализированному свойству, если у нее указана типизация.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
class Foo
{
    private string $bar;
    
    public function getBar()
    {
        return $this->bar;
    }
}
 
$foo = new Foo();
echo $foo->getBar();
Будет ошибка, так как свойство bar должно быть строкой. Но вы ей ничего не присвоили.

Добавлено через 3 минуты
DefenseMinister, Либо вы должны тогда указать значение по умолчанию. Если вы хотите чтоб был null

PHP
1
2
3
4
5
6
7
8
9
class Foo
{
    private ?string $bar = null;
    
    public function getBar()
    {
        return $this->bar;
    }
}
Скорее всего в методе save идет обращение к таким свойствам.
1
-9 / 8 / 3
Регистрация: 17.02.2021
Сообщений: 239
24.09.2021, 20:55  [ТС]
sad67man,

смотри теперь

PHP
1
2
3
4
5
6
7
class Test extends Model
{
    public string $login = '';
}
 
$test = new Test();
$test->save();
в БД у меня в таблице указано дефолтное значение Test, то есть если я просто хочу новую строку вставить, то мне пых перезапишет дефолт мускула пустой строкой

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

Добавлено через 2 минуты
Цитата Сообщение от sad67man Посмотреть сообщение
private ?string $bar = null;
то есть тут в БД будет вставлена строка и к ней применится дефолтное значение указанное в таблице?
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
24.09.2021, 20:57
Цитата Сообщение от DefenseMinister Посмотреть сообщение
то есть тут в БД будет вставлена строка и к ней применится дефолтное значение указанное в таблице?
Зависит от того как устроен ваш AR. Мне эти детали неизвестны.
1
-9 / 8 / 3
Регистрация: 17.02.2021
Сообщений: 239
24.09.2021, 21:05  [ТС]
sad67man, блин чёт я тупанул, у меня же сделано сравнение первоначального и текущего значения свойств, у меня при new если не было изменения значения свойства, то пустой insert отработает, не будет set login = ? )))

сори, затупил

Добавлено через 2 минуты
sad67man, а с типизацией извращаться, типа decimal это float да?
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
25.09.2021, 08:34
Цитата Сообщение от DefenseMinister Посмотреть сообщение
а с типизацией извращаться, типа decimal это float да?
Извращаться -- да. Но decimal во float лучше не переводить, так как float не очень точны.
https://www.php.net/manual/ru/... .float.php

Например, если в decimal у вас -- денежная величина, то лучше использовать Value Object. Например:
https://www.moneyphp.org/en/st... arted.html

Добавлено через 7 минут
Подробней про перевод типов можете узнать по запросу "php ActiveRecord type casting"
1
68 / 60 / 18
Регистрация: 03.12.2010
Сообщений: 365
27.09.2021, 09:29
Цитата Сообщение от DefenseMinister Посмотреть сообщение
блин чёт я тупанул, у меня же сделано сравнение первоначального и текущего значения свойств, у меня при new если не было изменения значения свойства, то пустой insert отработает, не будет set login = ? )))
А не пробовали сделать так?
PHP
1
2
$test = new Test();
$test->save(false);
1
-9 / 8 / 3
Регистрация: 17.02.2021
Сообщений: 239
27.09.2021, 09:41  [ТС]
Миушник, зачем мне самому думать, пусть PHP думает, нужно ли производить запрос и с какими столбцами работать

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public function save()
{
    if ($diffProperties = array_diff_assoc($this->getProperties(), $this->originalProperties)) {
 
        foreach ($diffProperties as $name => $value) {
            $params[] = "`$name` = ?";
            $values[] = $value;
            $this->originalProperties[$name] = $value;
        }
 
        $params = implode(', ', $params);
 
        $table = Database::getTable(static::class);
 
        if (is_null($this->id)) {
            Database::query("insert into $table set $params", $values);
 
            $this->id = $this->originalProperties['id'] = Database::getLastInsertId();
        } else {
            $values[] = $this->id;
 
            Database::query("update $table set $params where `id` = ?", $values);
        }
    }
}
0
51 / 38 / 13
Регистрация: 20.01.2019
Сообщений: 115
27.09.2021, 15:32
Цитата Сообщение от DefenseMinister Посмотреть сообщение
нельзя юзать свойство до инициализации
во-первых, можно задавать скалярные значения, по типу
PHP
1
private number = 0;
во-вторых, у тебя есть конструктор какбы. например
PHP
1
2
3
4
5
6
7
class A {
    private $created;
 
    public function __construct() {
        $this->created = new DateTime();
    }
}
0
-9 / 8 / 3
Регистрация: 17.02.2021
Сообщений: 239
27.09.2021, 15:39  [ТС]
Цитата Сообщение от ke1evra Посмотреть сообщение
private number = 0;
нет в php типа - number и где тут само свойство?

Цитата Сообщение от ke1evra Посмотреть сообщение
class A {
    private $created;
public function __construct() {
        $this->created = new DateTime();
    }
}
тут не указан тип свойства и при чём тут конструктор с созданием объекта, в AR свойство - это имя столбца таблицы БД, зачем мне в него служебный объект пихать?
0
51 / 38 / 13
Регистрация: 20.01.2019
Сообщений: 115
27.09.2021, 15:53
Цитата Сообщение от DefenseMinister Посмотреть сообщение
нет в php типа - number и где тут само свойство?
это я просто потерял $

Цитата Сообщение от DefenseMinister Посмотреть сообщение
в AR свойство - это имя столбца таблицы БД, зачем мне в него служебный объект пихать?
почитай, что такое ORM. неважно, чем является свойство, в объекте оно заполняется средствами языка.
а языку вообще всё равно, имя столбца это или фамилия строки

не понимаю, что за "служебный объект"

если очень хочется указывать тип свойства - на здоровье, это только плюс. просто это является нововведением php 7.4+, а бОльшая часть кода написана без указания типов, поэтому тут грубой ошибки нет. php всё ещё является динамически типизированным =)
0
-9 / 8 / 3
Регистрация: 17.02.2021
Сообщений: 239
27.09.2021, 16:04  [ТС]
Цитата Сообщение от ke1evra Посмотреть сообщение
это я просто потерял $
ну так тогда свойство не указано и при чём тут 0? Это явное указание значения, что приведёт к его записи в БД, а у меня в БД в этом столбце если указан свой дефолт то он будет перезаписан в 0, в моём случае нужно использовать nullable-свойства со значением по умолчанию = null

Цитата Сообщение от ke1evra Посмотреть сообщение
почитай, что такое ORM
не буду, потому что у меня AR

Цитата Сообщение от ke1evra Посмотреть сообщение
неважно, чем является свойство, в объекте оно заполняется средствами языка.
а языку вообще всё равно, имя столбца это или фамилия строки
важно, так как при save() в столбец будет записан служебный объект

Цитата Сообщение от ke1evra Посмотреть сообщение
не понимаю, что за "служебный объект"
он же - встроенный

Цитата Сообщение от ke1evra Посмотреть сообщение
если очень хочется указывать тип свойства - на здоровье
мне не хочется, мне нужно знать как типизировать свойства php относительно mysql
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
27.09.2021, 16:12
Цитата Сообщение от DefenseMinister Посмотреть сообщение
в AR свойство - это имя столбца таблицы БД, зачем мне в него служебный объект пихать?
Я же выше говорил про type casting. На стороне PHP в свойстве вполне может быть объект вместо строки, полученной из базы.
0
-9 / 8 / 3
Регистрация: 17.02.2021
Сообщений: 239
27.09.2021, 16:18  [ТС]
Цитата Сообщение от Para bellum Посмотреть сообщение
в свойстве вполне может быть объект вместо строки
мне не нужна такая сложность именно а AR: у меня свойство модели - столбец БД и всё
0
68 / 60 / 18
Регистрация: 03.12.2010
Сообщений: 365
27.09.2021, 16:30
Цитата Сообщение от DefenseMinister Посмотреть сообщение
зачем мне самому думать, пусть PHP думает, нужно ли производить запрос и с какими столбцами работать
Я работаю с Yii2, там тоже AR и для сохранения пустого значения без каких-либо проверок можно засэйвить без валидации данных.
Я вам посоветовал попробовать, как можно сохранить и данные в БД должны вставиться сами по себе, как в вашей БД предусмотрено.
Нужен null, будет null, поставили по дэфолту 0, то будет 0. И никаких предустановленных значений в модели не надо.

Добавлено через 7 минут
Если вам нужно сохранить в БД дату со временем, то вставляйте нужные значения.
PHP
1
2
3
4
5
$model = new MyModel([
 'mymodel_date' => date("Y-m-d"),
 'mymodel_datetime' => date("Y-m-d H:i:s"),
]);
$model->save(false);
Если вставим просто дату, там где дата и время, то время будет нулями записано автоматически.

Добавлено через 1 минуту
P.S.
Указывайте значения по-умолчанию для всех полей в БД.
Если не критично, то по-умолчанию null.
0
-9 / 8 / 3
Регистрация: 17.02.2021
Сообщений: 239
27.09.2021, 17:04  [ТС]
Цитата Сообщение от Миушник Посмотреть сообщение
Я работаю с Yii2, там тоже AR и для сохранения пустого значения без каких-либо проверок можно засэйвить без валидации данных.
зачем мне эта информация

Цитата Сообщение от Миушник Посмотреть сообщение
Нужен null, будет null
не будет если БД запрещает хранить null

Цитата Сообщение от Миушник Посмотреть сообщение
Я вам посоветовал попробовать
всё уже сделано

Para bellum, кстати ошибка о том что я юзаю неинициализированнОЕ свойство вылетает только если у меня public int $id; Это свойство находится в Model и если я пропишу public ?int $id = null;, то такого рода ошибок больше нет и можно пользоваться вот так

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
abstract class Model
{
    public ?int $id = null; // если public int $id, то получаем - Typed property core\base\Model::$id must not be accessed before initialization
    
    # тут наш ГК
}
 
class Debugger extends Model
{
    public string $date_time; // в БД datetime current_timestamp, при new Debugger() имеет значение *uninitialized*
    public string $text; // при new Debugger() имеет значение *uninitialized*
    public string $file; // при new Debugger() имеет значение *uninitialized*
    public int $line; // при new Debugger() имеет значение *uninitialized*
}
 
if ($logger === 'on') {
    $debugger = new Debugger();
 
    $debugger->text = $text; // нет ошибки заполнения неинициализированного свойства
    $debugger->file = $file; // нет ошибки заполнения неинициализированного свойства
    $debugger->line = $line; // нет ошибки заполнения неинициализированного свойства
 
    $debugger->save(); // в БД получаем новую запись
}
Добавлено через 5 минут
sad67man, смотри какой фокус получается

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
abstract class Model
{
    public int $id;
}
 
class Debugger extends Model
{
    public string $date_time;
    public string $text;
    public string $file;
    public int $line;
}
 
$debugger = new Debugger();
 
$debugger->text = $text;
$debugger->file = $file;
$debugger->line = $line;
 
$debugger->save();
Typed property core\base\Model::$id must not be accessed before initialization

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
abstract class Model
{
    public ?int $id = null; // инициализировали
}
 
class Debugger extends Model
{
    public string $date_time;
    public string $text;
    public string $file;
    public int $line;
}
 
$debugger = new Debugger();
 
$debugger->text = $text;
$debugger->file = $file;
$debugger->line = $line;
 
$debugger->save();
Без ошибок получаем новую запись в БД

А как же неинициализированные свойства модели Debugger?
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
27.09.2021, 17:06
Лучший ответ Сообщение было отмечено DefenseMinister как решение

Решение

Цитата Сообщение от DefenseMinister Посмотреть сообщение
А как же неинициализированные свойства модели Debagger?
Ошибка возникает при попытке чтения непроинициализированного свойства. Потому что интепретатор не понимает, что он должен вернуть. Когда вы в него что-то записываете - такой проблемы нет, наоборот - вы его инициализируете в этот момент)

Если вы не все свойства проинициализировали и у вас нет ошибки - это значит что вы и не обращаетесь к этим свойствам внутри метода save().
1
-9 / 8 / 3
Регистрация: 17.02.2021
Сообщений: 239
27.09.2021, 17:25  [ТС]
Цитата Сообщение от sad67man Посмотреть сообщение
чтения
ВОТ ОНО, а то так-то я насколько инглиш знаю, то читаю ошибку, как - свойство недоступно ДО инициализации

короче я понял, ошибка должна быть прописана вот так - Typed property core\base\Model::$id must not be accessed FOR READ before initialization

порешали

Добавлено через 10 минут
Цитата Сообщение от sad67man Посмотреть сообщение
Если вы не все свойства проинициализировали и у вас нет ошибки - это значит что вы и не обращаетесь к этим свойствам внутри метода save().
вот это вот очень важное дополнение расставляет все точки так сказать, спс...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.09.2021, 17:25
Помогаю со студенческими работами здесь

Конструктор, дефолтные значения
Как установить дефолтные значения в конструкторе, которые потом можно перезаписать при создании экземпляра класса? Допустим я не...

Дефолтные значения параметров
Всем привет, интересует совет может кто то сталкивался, имеется любая процедура например procedure vasya @Param1 INT = NULL, ...

Где дефолтные значения?
$data = Db::pdo('desc ' . $this->table()); foreach ($data as $datum) { $this->{$datum->Field} = $datum->Default; } выхлоп ...

Дефолтные значения реестра
Добрый день всем участникам форума! Всех с прошедшим НГ :) У меня возникла такая проблема, опишу максимально подробно и коротко. ...

Есть ли нормальная литература по работе с DOM моделью?
Есть ли нормальная литература (желательно русскоязычная) и ресурсы по работе с DOM моделью?


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru