Как я могу сделать ряд отношений в Laravel?

Я борюсь с этим некоторое время сейчас, но я не могу понять, как это работает.
В 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) для всех (), я получаю ошибку?

Есть кто-то, кто может мне помочь с этим?

Танки,

0

Решение

Ваши отношения неверны, измените их на:

// 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

это коллекции, поэтому вы не можете назвать что-либо из модели на них, вам нужно сначала получить одну модель.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]