Обновление версии Laravel влияет на ваш контроллер? - PullRequest
0 голосов
/ 24 августа 2018

Мой ReportController

use App\Site;
use App\Report;


public function showSpecificSite($site_id){

$reports = Report::whereHas('site', function($query) use($site_id) {
    $query->where('site_id', $site_id);
})->get(['email_date', 'url', 'recipient', 'report_id', 'site_id']);

$siteName = Site::find($site_id)->site_name;

return view('newsite', compact('site_id', 'siteName', 'reports'));
}

Route::get('sites/{site_id}',['as'=>'SpecificSite','uses'=>'ReportController@showSpecificSite']);

Модель сайта

public function report()
{
    return $this->hasMany('App\Report');
}

Модель отчета

public function site()
{
    return $this->belongsTo('App\Site');
}

Мой блейд-вид

<a href="{{route('SpecificSite',['site_id'=>$record->site_id])}}">view</a>

Вот проблема, я обновляю свою версию laravel 5.2.36 до 5.4.36 Это хорошо работает в версии 5.2, вот статьяэто работает. Функция Laravel, которая содержит два параметра

SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец «reports.site_site_id» в «выражении where» (SQL: выберите email_date, url, recipient, report_id, site_id из reports, где существует (выберите * из sites, где reports. site_site_id = sites. site_id и site_id = 1))

Мой маршрут: список был прежним.У меня также уже есть папка route / web.app.Возможно ли, что ваша функция контроллера пострадала при обновлении вашей версии Laravel?Любая идея, как это исправить.Заранее спасибо.

1 Ответ

0 голосов
/ 24 августа 2018

Поскольку ошибка связана со столбцом, который используется в одном из ваших отношений, скорее всего, что-то изменилось в том, как Laravel «угадывает» имя столбца FK в отношении (класс модели), а не что-то в вашем контроллере.

Вы можете явно указать имя FK в необязательных параметрах для belongsTo, тогда оно не будет угадывать. Проверьте подпись:

public function belongsTo($related, $foreignKey = null, $ownerKey = null, $relation = null)

Учитывая, что ваш FK в таблице отчетов называется site_id, вы должны сделать:

public function site()
{
    return $this->belongsTo('App\Site', 'site_id');
}

Я немного покопался в нем и обнаружил критическое изменение (введено в 5.4): https://github.com/laravel/framework/pull/16847.

Однако это было задокументировано в Руководстве по обновлению 5.4 :

Если внешний ключ не указан явно при определении отношения, Eloquent теперь будет использовать имя таблицы и имя первичного ключа для связанной модели для построения внешнего ключа. (...) [T] поведение может отличаться от предыдущих выпусков, если вы переопределяете свойство $primaryKey или метод getKeyName модели [related].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...