Алексей: если with не написать, то у вас в цикле для каждого учителя будет делаться отдельный sql запрос в базу, чтоб достать его предметы. Довольно расточительно.
В случае с with запросов будет сделано, если я не ошибаюсь, всего два.
DI это Dependency Injection. А автор спрашивает про Dependency INVERSION Principle.
DI это действительно один из походов к IoC (и поэтому говорить что они "ничем не отличаются" - некорректно, IoC - это принцип, DI - это реализация).
А вот термин Dependency INVERSION Principle что ниразу раньше не встречал. Подозреваю, что это действительно синоним IoC.
Но следует все же заметить, что в некоторых олимпиадных задачах есть ограничение на время работы решения, и у решения на php в таком случае может быть шанс не пройти.
AUN:
OPcache improves PHP performance by storing precompiled script bytecode in shared memory, thereby removing the need for PHP to load and parse scripts on each request.
А теперь соотнесите это со своим кодом и подумайте сами: может ли opcache его существенно ускорить или нет?
Посторонним В.: в java проще. Там значение null не является отдельным типом, его можно присвоить объекту любого типа. Т.е. если функция к примеру объявлена так, что тип возвращаемого значения User, то вы вполне можете вернуть null.
У вас в контроллере написано:
$query = Teachers::find();
Вот туда и добавьте:
$query = Teachers::find()->with('disciplines');