Laravel Eloquent с не идентифицирующими переменными

Я пытаюсь использовать laravel-eloquent, чтобы получить номера и их бронирование после определенной даты.

$fdate='2015-01-05';
$roomdata=Rooms::where('city_id','=',$citydata['id'])
->with('types')
->with('localities')
->with('slideshow')
->with(array('booking' => function($query){
$query->where('bookstart','>',$fdate);
}))
->get();

Это дает мне ошибку, говоря $fdate не определено Но, когда я делаю

$query->where('bookstart','>','2015-01-05');

Это прекрасно работает. Есть ли причина этого? Может кто-нибудь предложить хорошее решение этой проблемы?

3

Решение

Вы используете закрытие внутри обратного вызова with, Во-первых, цитата из этой страницы документа:

Замыкания также могут наследовать переменные из родительской области. Любые такие переменные должны быть переданы в конструкцию языка использования.

Вы пытаетесь получить доступ к переменной из родительской области внутри вашей анонимной функции, поэтому вы должны сначала передать ее use создайте для того, чтобы PHP знал, что вы создаете замыкание вокруг этой переменной:

$roomdata = Rooms::where('city_id','=',$citydata['id'])
->with('types')
->with('localities')
->with('slideshow')
->with(array('booking' => function($query) use($fdate) {
$query->where('bookstart','>',$fdate);
}))
;

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

var foo = 'bar';
(function() {
alert(foo);
})();

В PHP получение доступа к внешним переменным из внутренних функций не происходит автоматически. Таким образом, PHP различает укупорочные а также анонимные функции (иначе, как «лямбды»), чего не делает JavaScript, по крайней мере, по синтаксису. Тем не менее, это не ясно изложено в документации (руководство, кажется, приравнивает их, когда они на самом деле не совпадают).

5

Другие решения

Переменная область:

    $fdate='2015-01-05';
$roomdata=Rooms::where('city_id','=',$citydata['id'])
->with('types')
->with('localities')
->with('slideshow')
->with(array('booking' => function($query) use ($fdate){
$query->where('bookstart','>',$fdate);
}))
->get();
1

поставить точку с запятой примерно так:

$fdate='2015-01-05';
0