显示功能不起作用。无法按 id 检索元素。拉拉维尔 5.8
Posted
技术标签:
【中文标题】显示功能不起作用。无法按 id 检索元素。拉拉维尔 5.8【英文标题】:Show function not working. Can't retrieve element by id. Laravel 5.8 【发布时间】:2022-01-05 03:30:08 【问题描述】:我创建了资源控制器,在我的 laravel 5.8 项目中每个模型一个。我希望 show 函数根据插入在 URL 上的 id 返回我想要的 DB 元素,就像它应该做的那样。现在我直接在我的控制器上进行测试,我没有使用我模型的“thisCircuit”功能。调用索引,返回一个包含所有电路的 json。调用该节目不会返回任何内容。我该如何解决?
显示功能
public function show(circuits $circuits)
$circuits = circuits::findOrFail($circuits);
dd($circuits);
型号
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
class circuits extends Model
protected $fillable = [
'circuitId', 'circuitRef', 'name',
'location', 'country', 'lat',
'lng', 'alt', 'url',
];
protected $primaryKey = 'circuitId';
public function races()
return $this->hasMany('App\races', 'circuitId');
public function allCircuits()
$data = Circuits::all();
return response()->json($data);
public function thisCircuit($id)
$id = circuits::findOrFail($id);
Web.php 文件
Route::get('/test', 'CircuitsController@index');
Route::get('/test/circuit', 'CircuitsController@show');
浏览器上的网址
http://localhost:8000/test/1
浏览器上的结果
Illuminate\Database\Eloquent\Collection #947 ▼
#items: []
【问题讨论】:
您已经从方法参数中获得了$circuits
。 (可能还想将您的模型重命名为单数 Circuit
)
@brombeer 是对的,Laravel 会自动为你处理这个问题。这称为路由模型绑定,可以在文档中找到:laravel.com/docs/5.8/routing#route-model-binding 如果您真的不希望发生这种情况,您可以简单地删除变量类型(所以只写 $circuits 作为参数)
谢谢。删除变量类型解决了它。
@GkChris99 请问您为什么这样做而不使用路由模型绑定?有了这个,你可以简单地删除 $circuits =circuits::findOrFail($circuits);在您的代码中并具有相同的效果? :)
【参考方案1】:
好的,让我们清理一下这个解决方案。很多小风格问题,如果不调整会伤害你的前进。
首先
在大多数标准命名约定和单数形式中,类名称以大写字母开头。
circuits.php
应该是。
Circuit.php
其次
您已经在使用模型绑定。如果您采用这种方法,您实际上可以直接返回电路。作为奖励Laravel
如果返回的数据是模型,则不必返回响应,除非您想将响应代码从 200 更改为其他值。
public function show(Circuit $circuit)
return $circuit;
你也误解了firstOrFail()
。你写的这段代码永远不会返回多个电路,这将返回一个单一的模型。
$circuits = circuits::findOrFail($circuits);
【讨论】:
以上是关于显示功能不起作用。无法按 id 检索元素。拉拉维尔 5.8的主要内容,如果未能解决你的问题,请参考以下文章
拉拉维尔 | Auth::user()->id 在 AppServiceProvider 中不起作用