【问题标题】:Show function not working. Can't retrieve element by id. Laravel 5.8显示功能不起作用。无法按 id 检索元素。拉拉维尔 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);在您的代码中并具有相同的效果? :)

标签: laravel database model controller show


【解决方案1】:

好的,让我们清理一下这个解决方案。很多小风格问题,如果不调整会伤害你的前进。

首先

在大多数标准命名约定和单数形式中,类名称以大写字母开头。

circuits.php

应该是。

Circuit.php

其次

您已经在使用模型绑定。如果您采用这种方法,您实际上可以直接返回电路。作为奖励Laravel 如果返回的数据是模型,则不必返回响应,除非您想将响应代码从 200 更改为其他值。

public function show(Circuit $circuit) {
    return $circuit;
}

你也误解了firstOrFail()。你写的这段代码永远不会返回多个电路,这将返回一个单一的模型。

$circuits = circuits::findOrFail($circuits);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 2016-10-06
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 2022-01-26
    • 2017-09-02
    相关资源
    最近更新 更多