首页 > 解决方案 > 为什么 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(国家)名称(国家)标题(帖子)-每个国家的所有

手册描述了皱巴巴的东西

标签: phpmysqleloquent

解决方案


如果将外键和列名传递给 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']在顶部添加等。


推荐阅读