2017-01-26 1 views
1

Я изучаю отношения в рамках PHP Laravel, и я пытаюсь построить этот запрос,Handling отношения в модели в Laravel

SELECT * FROM users u INNER JOIN link_to_stores lts ON u.id=lts.user_id INNER JOIN stores s ON lts.store_id=s.store_id WHERE lts.privilege = 'Owner'

Я построил это в модели

Link_to_store.php

public function store() 
{ 
    return $this->belongsTo('App\Store'); 
} 

public function user() 
{ 
    return $this->belongsTo('App\User'); 
} 

User.php

public function store_links() 
{ 
    return $this->hasMany('App\Link_to_store'); 
} 

Store.php

public function user_links() 
{ 
    return $this->hasMany('App\Link_to_store'); 
} 

Я попробовал этот запрос, но это только соединение пользователя и link_to_store таблицу

$personal_stores = Auth::user()->store_links->where('privilege','=','Owner');

Теперь я запутался, как присоединиться магазин таблицы тоже. Может кто-нибудь помочь с этим?

Схема подобна этой

Stores Таблица

store_id store_name

Пользователи Таблица

id name

Link_to_stores Таблица

id store_id user_id privilege

+0

Возможно, вместо '$ personal_stores = Auth :: user() -> store_links-> где ('privilege', '=', 'Owner');' with '$ personal_stores = Auth :: user() -> где ('privilege', '=', 'Owner') -> store_links() -> store(); 'Попробуйте это и скажите мне, что выводится – KuKeC

+0

' Вызов неопределенного метода Illuminate \ Database \ Query \ Builder :: store_links () ' – Alex

ответ

0

Я полагаю, что store_links фактически представляет собой сводную таблицу. В этом случае вы можете использовать belongsToMany(), это автоматически позаботится о сводной таблице.

Чтобы сделать это, в вашей User модели изменения функции сохранения этого:

function stores() { 
    return $this->belongsToMany('App\Store', 'store_links', 'user_id', 'store_id')->withPivot('privilege'); 
} 

Поскольку первичный ключ stores не id, вы должны определить это в вас модель магазина со следующим линия:

protected $primaryKey = 'store_id'; 

Теперь, чтобы получить в магазинах для пользователя, вы просто звоните

$stores = Auth::user->stores()->wherePivot('privilege', 'Owner')->get(); 
+0

Пожалуйста, проверьте схему, я отредактировал вопрос – Alex

+0

Я обновил свой ответ на макет базы данных, это должно заставить работу работать. – Jerodev

+0

Я получаю это 'Column not found: 1054 Unknown column 'stores.id' в 'on clause' (SQL: select' stores'. *, 'Link_to_stores'.'user_id' как' pivot_user_id', 'Link_to_stores'.' store_id' как 'pivot_store_id',' Link_to_stores'.'privilege' как 'pivot_privilege' из' store' внутреннего соединения 'Link_to_stores' на' stores'.'id' = 'Link_to_stores'.'store_id' где' Link_to_stores'.'user_id '= 1 и' Link_to_stores'.'privilege' = Owner) ' – Alex

0

Я изучаю отношения в рамках PHP Laravel, и я пытаюсь построить этот запрос,

SELECT * FROM users u INNER JOIN link_to_stores lts ON u.id=lts.user_id INNER JOIN stores s ON lts.store_id=s.store_id WHERE lts.privilege = 'Owner'

Вы пытаетесь сделать присоединиться здесь. Вы можете сделать присоединиться, как это:

$stores = User::join('link_to_stores as lts', 'users.id', '=', 'lts.user_id')->join('stores as s', 'lts.store_id', '=', 's.id')->where('lts.privilege', 'Owner')->get(); 

Но как Jerodev отметил, кажется, что многие ко многим могли бы иметь больше смысла в вашем случае.Разница в том, что отношения будут фактически выполнять 2 запроса (1 для исходной модели, 1 для отношений). Затем он привяжет связанные модели к исходной модели (что очень удобно).

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

  • Нет связанных вопросов^_^