Почему PHP видит не все поля объекта?

Хочу получить значения полей descriptionID и paragraphID, но код совсем их не видит. При этом поля text и id видит прекрасно. Не понимаю, что не так делаю. Помогите осознать ошибку, пожалуйста!

P.S. используется RedBeanPHP; в $texts возвращается массив объектов; $text - объект с полями, указанными на скриншоте 1

<?php 
$texts = R::find(/* мой запрос (правильный) */);
$paragraphID = 2;
foreach($texts as $text){
    echo($paragraphID." - paragraphID<br>");
    echo($text->id." / ".$text['id']."<br>");
    echo($text->descriptionID." / ".$text['descriptionID']."<br>");
    echo($text->paragraphID." / ".$text['paragraphID']."<br>");
    echo($text['text']." / ".$text->text);
    $paragraphID++;
} ?>

Скриншот 1: (бд в phpMyAdmin)

введите сюда описание изображения

Скриншот 2: (что выводится в браузере)

введите сюда описание изображения


Ответы (2 шт):

Автор решения: Егор Банин

RedBeanPHP довольно странный инструмент для работы с бд, поэтому он делает так

if ( !ctype_lower( $property ) ) { // если camelCase (например paragraphID)
    $property = $this->beau( $property ); // поменять на snake_case (paragraph_id)
    ...
}

// искать поле (paragraph_id)

RedBean думает что поля в вашей бд названы в snake_case (это дурацкая практика, которая до сих пор широко распространена), а обращаться вы будете к ним в camelCase (у вас же ООП и всё такое). И он заботливо преобразует имена в snake_case. Довольно мило с его стороны :-)

Единственный способ побороть это -- задать алиас в snake_case для этих полей.

→ Ссылка
Автор решения: Kirill Peace

Методом проб и ошибок я нашел верный и легкий способ избежать данной проблемы.
Всё решается заменой функции find на getAll: $texts = R::getAll("SELECT * FROM ``mytable`` WHERE ``descriptionID`` = '$id'");


Таким образом, в бд можно оставить `descriptionID` и `paragraphID` в данном виде.
Обращение же к полям объекта `$text` производится следующим образом: `$text['text']` , `$text['descriptionID']` , `$text['paragraphID']` и т.д.
→ Ссылка