Laravel版本升级会影响您的控制器吗?

时间:2018-08-24 15:41:16

标签: laravel laravel-5.4

我的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 Function that hold two parameters

SQLSTATE [42S22]:找不到列:1054“ where子句”中的未知列“ reports.site_site_id”(SQL:选择email_dateurlrecipient,{{1 }},report_id来自site_id的位置(从{{1}中选择*,其中reportssites = reportssite_site_idsites = 1))

我的route:list之前是相同的。我也有我的route / web.app文件夹。 升级laravel版本时,控制器功能是否有可能受到影响?任何想法如何解决此问题。提前致谢。

1 个答案:

答案 0 :(得分:3)

由于错误涉及到在您的一个关系中使用的列,因此很有可能是Laravel如何“猜测”关系(模型类)中的FK列名(而不是在Controller中)。

您可以在belongsTo的可选参数中显式指定FK名称,这样就不会猜测它。检查签名:

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

但这已记录在the 5.4 Upgrade Guide中:

  

如果在定义关系时未明确指定外键,则Eloquent现在将使用表名和主键名作为相关模型来构建外键。 (...)如果您要覆盖[相关]模型的$primaryKey属性或getKeyName方法,则行为可能与以前的版本不同。