Почему многие из документов Eloquent не работают? - PullRequest
0 голосов
/ 26 февраля 2020

Пример из документации «Многим через» не запускается Где здесь ошибка?

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'

);

}

Пользователь модели в таблице есть другие столбцы, но они не используются в этом примере

<?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);
      }
}

маршрутизатор настроен правильно-проверено

Задача: показать три столбца в таблице идентификатор (страна) название (страна) название (сообщения) - все для каждой страны

в руководстве описывается что-то мятое

1 Ответ

1 голос
/ 26 февраля 2020

Если вы передаете через внешние ключи и имена столбцов методу 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...
        );

Ваш метод имеет только один идентификатор.

Кроме того, этот лог c должен быть внутри функции с именем posts () в модели Country. Например:

Страна. 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, что вы можете сделать с помощью встроенного метода Json (). Если вы не хотите, чтобы возвращались все столбцы (например, возможно, вы не хотите показывать временные метки), вы можете отредактировать страну. php или сообщение. php и добавить protected $hidden = ['created_at','updated_at'] et c. наверху.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...