Laravel 5 готов к загрузке, сбрасывая лидирующие нули с внешнего ключа

Я полагаю, что я столкнулся с ошибкой в ​​том, как 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() преуспевает. Я остаюсь загадочным.

2

Решение

Вы не показываете классы моделей, но я думаю, что вам нужно public $incrementing = false; в School Красноречивая модель. В противном случае он будет приведен к int при сопоставлении отношения, теряя все ведущие нули.

2

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

Других решений пока нет …

По вопросам рекламы [email protected]