Я полагаю, что я столкнулся с ошибкой в том, как Laravel 5.3 обрабатывает нетерпеливую загрузку, когда внешний ключ представляет собой строку, содержащую числа с нулевым заполнением.
У меня есть две модели (используя бэкэнд MySQL), School
а также Student
, id
поле в School
является строкой и содержит 5-значные числа, назначенные государством, включая начальные нули. Student
BelongsTo
School
и содержит school_id
поле, которое определяется идентично id
поле в School
, Я провел некоторое тестирование, и я обнаружил, что когда я звоню Student::with('school')
Я получил ожидаемое School
модели до тех пор, пока school_id
в Student
не содержит начальных нулей, но возвращает нет School
модели для school_id
значения с ведущими нулями.
Я сделал прямое тестирование со свежеиспеченным School
записи и значения хранятся правильно с ведущими нулями в обеих таблицах базы данных, и когда я пытаюсь напрямую запросить таблицы, ведущие нули работают нормально, но как только with()
входит в уравнение, вещи ломаются. Я пытался воспроизвести ошибку с помощью других средств, даже вручную создавая whereIn()
вызовы к зеркальному синтаксису запросов, построенных with()
, но все остальное правильно возвращает ожидаемые записи.
Этот код прекрасно работал до подъема по лестнице обновления Laravel с 4.1 до 5.3, поэтому мне интересно, что могло измениться. Я зашел так далеко, что копался в репозиторий GitHub для BelongsTo, и ни одна из обработки параметров, кажется, не отбрасывает начальные нули, поэтому я действительно в растерянности относительно того, почему with()
ломается таким образом.
Итак, есть ли у кого-нибудь идеи, которыми они могут поделиться? Я в тупике, и предпочел бы не придумывать with()
, Я также заявляю заранее, что я не могу отбросить ведущие нули из id
поле, это не вариант, они должны быть сохранены, а не просто отображаться, как с ZEROFILL.
ОБНОВЛЕНИЕ: я приложил пример, который устанавливает, что school_id
Хранится в Student
может успешно подключиться к соответствующему School
при использовании отдельно от with()
заявление:
$interventions = Intervention::with('school')->where('id','=',780)->get();
$schools = School::whereIn('id',$interventions->pluck('school_id')->all())->get();
throw new \Exception(print_r($interventions,true).'|'.print_r($schools,true));
Вот (отредактированные для краткости) результаты \ Exception:
Exception in AdminController.php line 273:
Illuminate\Database\Eloquent\Collection Object
(
[items:protected] => Array
(
[0] => App\Models\Student Object
(
[attributes:protected] => Array
(
[id] => 780
[school_id] => 01234
)
[relations:protected] => Array
(
[school] =>
)
)
)
)Illuminate\Database\Eloquent\Collection Object
(
[items:protected] => Array
(
[0] => App\Models\School Object
(
[attributes:protected] => Array
(
[id] => 01234
[school] => Test1
[district_id] => 81000
[inactive] => 0
[see] => 0
)
)
)
)
Так что пока Student::with('school')
не может подтянуть соответствующий School
, кормя так же Student->school_id
значения для School::whereIn()
преуспевает. Я остаюсь загадочным.
Вы не показываете классы моделей, но я думаю, что вам нужно public $incrementing = false;
в School
Красноречивая модель. В противном случае он будет приведен к int при сопоставлении отношения, теряя все ведущие нули.
Других решений пока нет …