Я борюсь с этим некоторое время сейчас, но я не могу понять, как это работает.
В Laravel у меня есть несколько моделей с отношениями. Я не хотел бы иметь все учетные записи, основанные на зарегистрированном пользователе и переданном параметре для рабочей области.
Вот как выглядят модели: (Я использовал только методы, чтобы это было коротким)
Модель пользователя:
class User extends Eloquent implements UserInterface, RemindableInterface {
public function workspaces()
{
return $this->hasMany('Workspace', 'user_id');
}
public function account()
{
return $this->hasManyThrough('account', 'Workspace', 'id', 'workspace_id');
}
}
Модель рабочей области:
class Workspace extends Eloquent implements UserInterface, RemindableInterface {
public function account()
{
return $this->hasMany('account', 'workspace_id', 'id');
}
public function user()
{
return $this->belongsTo('User', 'user_id', 'id');
}
}
Модель аккаунта
class account extends Eloquent implements UserInterface, RemindableInterface {
public function account_url()
{
return $this->hasOne('acountUrl', 'id', 'account_url_id');
}
public function workspace()
{
return $this->belongsTo('Workspace', 'workspace_id', 'id');
}
}
Модель account_url
class account_url extends \Eloquent implements UserInterface, RemindableInterface {
public function account()
{
return $this->belongsToMany('account', 'id', 'account_url_id');
}
}
Итак, я хочу от вошедшего в систему пользователя с определенной рабочей областью все учетные записи с account_urls
как то так: user-> workspace-> account-> account_url
Я пробовал следующие вещи, но это не работает:
$account_urls = user::find( Auth::user()->id)->first()->workspaces()->where('id', '=', 1)->account()->account_url()->select('url')->get();
а также:
$account_urls = account::where('workspace_id', '=', '1')->account_url()->select('url')->get();
Только когда я делаю это так:
$account_urls = account::find(1)->account_url()->select('url')->get();
Но тогда я получаю только 1 URL, но когда я заменяю find (1) для всех (), я получаю ошибку?
Есть кто-то, кто может мне помочь с этим?
Танки,
Ваши отношения неверны, измените их на:
// User
public function account()
{
return $this->hasManyThrough('Account', 'Workspace', 'user_id', 'workspace_id');
}
// Account
// use camelCase for relations
public function accountUrl()
{
// I assume you have account_url_id on accounts table
// If it's opposite, then use hasOne
return $this->belongsTo('AcountUrl', 'account_url_id', 'id');
}
// AccountUrl (use camelCase)
public function account()
{
// if above is hasOne, then here belongsTo instead.
return $this->hasOne('account', 'account_url_id', 'id');
}
Теперь выбираем модели:
// this part is .. amazing ;)
user::find( Auth::user()->id )->first();
// it does this:
Auth::user()->id // fetch user and get his id
user::find( .. ) // fetch user with given id, you have this user already above...
->first() // fetch first row from users table (not the one with id provided before)
так ты хочешь:
$account_urls = Auth::user()->workspaces()
->where('id', '=', 1)->first() // first fetches the result
// or simply
// ->find(1)
->accounts()->first()->accountUrl()
->pluck('url'); // this does 'SELECT url' and returns only this field instead of model
Просто запомните это:
$user->workspaces
$workspace->accounts
это коллекции, поэтому вы не можете назвать что-либо из модели на них, вам нужно сначала получить одну модель.
Других решений пока нет …