ну тут все зависит от объема данных, если у Вас будет небольшие объемы пару десятков тысяч - то тот же джойн вполне справится. Если у Вас будут десятки милионов записей тогда оптимальнее делать отдельную ячейку и на триггерах ее обновлять. Хотя тут опять таки все зависит от специфики Вашей системы и от объемов
т.е. грубо говоря будет в лайоуте некий блок который содержит в себе данные модели....
в таком случае (в зависимости от задачи) можно сделать что-то из этого:
1. Реализовать виджет использующий модель и выводящий данные в нужном виде
2. Создать свой класс-потомок VIEW реализовывающий нужный функционал, и соответственно использовать его в приложении
3. Создать класс-обертку, разместить его в секции bootstrap и рендерить данные соответственно в этом классе.
Почему не стоит использовать null
1. Скорость работы (на маленьких данных вряд ли будет заметно)
2. Гемор с последующими запросами. Если Вы будет использовать в запросах агрегатные функции, конкатенацию и т.п. корректно сделать по столбцу с null Вы это не сможете. Точнее сможете только через костыли. К примеру агрегатная функция SUM если в нее попадет хоть одно значение null - вернет NULL. При чем такие баги могут обнаружится далеко не сразу
Я не говорю что null вообще не стоит использовать, просто нужно его использовать с умом.
поставьте проверку на существование
if(isset($session['booking']) && !empty($session['booking'])){
}
возможно вы обращаетесь к несуществующему элементу (опечатка или что-то подобное)