2015-12-16 3 views
1

ОБНОВЛЕНИЕ: посмотрев на класс Eloquent hasManyThrough, не меняя его, я не вижу, как я могу связать приведенные ниже таблицы. Заявления Params для вызова метода является:Laravel 5 Eloquent HasManyThrough - имена столбцов в ссылках

class HasManyThrough extends Relation 
{ 
    /** 
    * The distance parent model instance. 
    * 
    * @var \Illuminate\Database\Eloquent\Model 
    */ 
    protected $farParent; // in my case: User::class 

    /** 
    * The near key on the relationship. 
    * 
    * @var string 
    */ 
    protected $firstKey; // in my case: organisation_users_roles(organisation_id) 

    /** 
    * The far key on the relationship. 
    * 
    * @var string 
    */ 
    protected $secondKey; // in my case: users(id) 

    /** 
    * The local key on the relationship. 
    * 
    * @var string 
    */ 
    protected $localKey; // in my case: organisation(id) 

Таким образом, нет никакого способа узнать, стандартный Красноречивый hasManyThrough, что первое звено organisation(id)->organisation_users_roles(organisation_id) и вторая ссылка organisation_users_roles(user_id)->users(id)

ли я неправильно?


Я не могу найти пример синтаксиса для использования, если у вас есть три таблиц связаны через hasManyThrough и имена столбцов в каждой таблице, не следует за именованием Красноречивого. В моем случае:

три таблицы:

Organisations 
Users 
Roles 
Organisation_Users_Roles (3 way linking) 

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

Имен столбцов зацеплений являются:

`Organisation: id` links to `Organisation_Users_Roles: organisation_id" 
`Users: id` links to `Organisation_Users_Roles: user_id" 
`Roles: id` links to `Roles: role_id" 

Organisation_Users_Roles также содержит id столбца (по существу, его первичный ключ или идентификатор строки).

Я попытался (в качестве примера) в Organisation классе:

public function users() 
{ 
    return $this->hasManyThrough(User::class, OrganisationUserRole::class); 
} 

В примере DOCS таблицы являются:

countries 
    id - integer 
    name - string 

users 
    id - integer 
    country_id - integer 
    name - string 

posts 
    id - integer 
    user_id - integer 
    title - string 

Так, в примере:

country(id)->users(country_id) и users(id)->posts(user_id)

И в моем случае:

organisation(id)->organisation_users_roles(organisation_id) и organisation_users_roles(user_id)->users(id)

Но так как имена столбцов не являются точными, к примеру на красноречивые Docs (как это связующая таблица три способа), то я получаю следующее сообщение об ошибке при использовании метода:

[PDOException] 
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'users.user_role_id' in 'on clause' 

Я хочу, чтобы получить первый возвращаемый пользователю для текущей организации, я называю это так:

$entry['created_user_id'] = $organisation->users->first(); 

Благодаря

ответ

0

В вашей организации таблицы, попробуйте

return $this->hasManyThrough('App\..path-to..\User', 'App\..path-to..\Organisation_Users_Roles', 'organisation_id', 'id'); 
+0

Привет Бхарат, он не работает. Я не получаю 'users.user_id'. – TheRealPapa

+0

См. Мой отредактированный ответ –

+0

Привет, Bharat, это возвращает null, что неверно. Запрос работает, но связь между двумя таблицами некорректно построена ('user_role'.'id' =' users'.'id') – TheRealPapa

Смежные вопросы