Вопрос:

Использование hasManyThrough, где целевая таблица имеет один-к-одному

mysql laravel eloquent

7 просмотра

1 ответ

1201 Репутация автора

Если мы возьмем пример Laravels на hasManyThroughи изменить его следующим образом:

countries
    id - integer
    name - string

users
    id - integer
    country_id - integer
    website_id - integer
    name - string

websites
    id - integer
    title - string

Имея в usersкачестве промежуточной связи, можно использовать hasManyThrough()на countryмодели , чтобы получить websites?

Я пытался это, и это приводит к ошибке

namespace App;

use Illuminate\Database\Eloquent\Model;

class Country extends Model
{
    /**
     * Get all of the websites for the country.
     */
    public function websites()
    {
        return $this->hasManyThrough('App\Website', 'App\User');
    }
}

Illuminate\Database\QueryException: SQLSTATE[42S22]: Column not found: 1054 Unknown column

Может быть, usersдолжно быть много, websitesчтобы это работало?

Автор: Toydor Источник Размещён: 11.08.2019 07:50

Ответы (1)


0 плюса

860 Репутация автора

Вы можете изменить структуру таблицы, чтобы она соответствовала ожиданиям Laravel для комментариев @ Samir, или вы можете настроить ключи в соответствии с существующей структурой таблицы.

https://laravel.com/docs/5.8/eloquent-relationships

Типичные соглашения Eloquent по внешним ключам будут использоваться при выполнении запросов отношения. Если вы хотите настроить ключи отношения, вы можете передать их в качестве третьего и четвертого аргументов методу hasManyThrough. Третий аргумент - это имя внешнего ключа промежуточной модели. Четвертый аргумент - это имя внешнего ключа в окончательной модели. Пятый аргумент - это локальный ключ, а шестой аргумент - это локальный ключ промежуточной модели:

Я не уверен, что мой мозг все это правильно обработал, но попробуйте это:

public function websites()
{
    return $this->hasManyThrough('App\Website', 'App\User','country_id','website_id','id','id');
}
Автор: matticustard Размещён: 11.08.2019 08:16
32x32