php - 为什么 Eloquent 文档中的 hasManyThrough 不起作用?
问题描述
文档中的示例“To many through”无法运行这里的错误在哪里?
countries
id - integer
name - string
users
id - integer
country_id - integer
name - string
posts
id - integer
user_id - integer
title - string
模范国家
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Country extends Model
{
protected $fillable = [
'id', 'name',
];
//server error
return $this->hasManyThrough(
'App\Post', 'App\User',
'country_id', 'user_id', 'id'
);
}
Model User 表中还有其他列,但在本例中没有用到
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Authenticatable
{
protected $fillable = [
'id', 'country_id', 'name'
];
}
模型柱
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
protected $fillable = [
'id', 'user_id', 'title',
];
}
资源国
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class Country extends JsonResource
{
public function toArray($request)
{
return parent::toArray($request);
return [
'id' => $this->id,
'name' => $this->name,
'title' => $this->title,
];
}
}
控制器国家
<?php
namespace App\Http\Controllers\Api;
use App\Country;
use App\Http\Resources\Country as CountryResource;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class CountryController extends Controller
{
public function index()
{
$countries = Country::with(['post'])->get();
return CountryResource::collection($countries);
}
}
路由器配置正确检查
任务:在表格中显示三列id(国家)名称(国家)标题(帖子)-每个国家的所有
手册描述了皱巴巴的东西
解决方案
如果将外键和列名传递给 hasManyThrough 方法,则必须同时指定外键和本地键。来自 Laravel 文档:
return $this->hasManyThrough(
'App\Post',
'App\User',
'country_id', // Foreign key on users table...
'user_id', // Foreign key on posts table...
'id', // Local key on countries table...
'id' // Local key on users table...
);
您的方法只有一次“id”。
此外,这个逻辑应该在 Country 模型上的一个名为 posts() 的函数中。例如:
国家.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Country extends Model
{
protected $fillable = [
'id', 'name',
];
public function posts() {
return $this->hasManyThrough(
'App\Post', 'App\User',
'country_id', 'user_id', 'id', 'id');
}
}
然后在您的国家/地区控制器中:
<?php
namespace App\Http\Controllers\Api;
use App\Country;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class CountryController extends Controller
{
public function index()
{
$countries = Country::with('posts')->get();
return $countries->toJson();
}
}
我会摆脱 CountryResource 的事情。它所做的一切(我认为)是将数据转换为 json,您可以使用内置的 toJson() 方法来完成。如果您不希望返回所有列(例如,您可能不希望显示时间戳),您可以编辑 Country.php 或 Post.php 并protected $hidden = ['created_at','updated_at']
在顶部添加等。
推荐阅读
- flutter - 如何在 Flutter 中缩放对话框
- discord.js - 每当发送 dm 时,discordjs 都会记录问题
- linux - 为什么`sh -c "export a=1&&echo $a"`什么都不返回?
- java - Java Drum Sequencer:如何从复选框状态集成实时排序?
- c++ - 运行时检查失败 #2 - 变量“e”周围的堆栈已损坏。发生了
- python - Django ImportError:无法从部分初始化的模块“accounts.models”导入名称“ReporterProfile”(很可能是由于循环导入)
- javascript - 使用 useState react hook 后返回的状态变量显示 .map 不是函数
- node.js - 从集合返回的重复项目
- c++ - 如何在 vscode 中使用 C++20?
- c# - WPF中的旋转图像不考虑屏幕尺寸