Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Пустые функции не нужны. Laravel достаточно умен, чтобы работать со смешанным набором отношений с ограничениями и без них.
Entry::with(array(
'foo' => function($query) use ($id) {
$query->where('user_id', $id);
},
'author',
'lastModifiedBy'
))->...;
Вот как Laravel различает два:
в Illuminate\Database\Eloquent\Builder@parseRelations
foreach ($relations as $name => $constraints)
{
// If the "relation" value is actually a numeric key, we can assume that no
// constraints have been specified for the eager load and we'll just put
// an empty Closure with the loader so that we can treat all the same.
if (is_numeric($name))
{
$f = function() {};
list($name, $constraints) = array($constraints, $f);
}
Как описывает комментарий, Laravel фактически добавляет пустое замыкание сам по себе, если ключ элемента массива является числовым.
Вы не выполняете эти пустые функции. Вы можете напрямую поместить на них отношения.
Entry::with(array(
'foo' => function($query) use ($id) {
$query->where('user_id', $id);
},
'author', 'lastModifiedBy'
))->...;
Или, альтернативно, вы можете поместить те, которые вложены в метод.
Entry::with(array(
'foo' => function($query) use ($id) {
$query->where('user_id', $id);
}
))
->with('author', 'lastModifiedBy')->...;