получить значения, используя отношения многие ко многим на моделях Laravel 5 - PullRequest
0 голосов
/ 14 сентября 2018

Я действительно новичок в работе с laravel 5.0, поэтому у меня возникла эта проблема, когда я пытаюсь получить результат, используя модель. У меня есть таблица пользователей со списком пользователей, которые могут быть менеджерами или нет, они могут назначить одну или несколько компаний или ни одной, таблицу компаний с компаниями, в которых может быть один или несколько менеджеров, и сводную таблицу, которую я называется companies_managers. Я установил отношения в каждой модели так:

/***User model***/
public function companies()
{
    return $this->belongsToMany('App\Company', 'companies_managers','id', 'manager_id');
}

и то же в модели компании

public function managers()
{
    return $this->belongsToMany('App\User', 'companies_managers', 'id', 'company_id');
}

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

$managers = Company::find($id)->managers();

Буду признателен за любую помощь, которую вы можете мне дать

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

Использование ->managers() (с квадратными скобками) на самом деле не возвращает связанных менеджеров, а скорее экземпляр Builder ("огромный объект"), который можно затем связать с дополнительными параметрами, прежде чем, наконец, получить их с помощью ->get() (или другое закрытие, например ->first(), ->paginate() и т. Д.)

Использование ->managers (без скобок) попытается получить доступ к связанным менеджерам и выполнить любую дополнительную логику для их получения.

Итак, у вас есть 2 варианта:

$company = Company::with(["managers"])->findOrFail($id);
$managers = $company->managers;

Или

$company = Company::findOrFail($id);
$managers = $company->managers()->get();

Оба из них будут выполнять необходимую логику, чтобы вытащить менеджеров. ->with() и без скобок немного эффективнее, все это делается в одном запросе, так что имейте это в виду.

0 голосов
/ 14 сентября 2018

Спасибо за вашу помощь, ребята, я решил проблему с исправлением отношений в моделях к этому:

        return $this->belongsToMany('App\Company', 'companies_managers', 'manager_id', 'company_id');

и это

        return $this->belongsToMany('App\User', 'companies_managers', 'company_id', 'manager_id');

Идентификаторы, которые я установил, не были правильными для функции assignTany

А это

$managers = Company::find($id)->managers();

тоже была проблемой, глупая ошибка с моей стороны. Я решил вернуть экземпляр Builder, используя просто return вместо dd (), таким образом, я получил значения, которые искал. Спасибо всем!

0 голосов
/ 14 сентября 2018

Вам просто нужно разделить ваш код;

// this will find the company based on the id, or if it cannot find 
// it will fail so will abort the application
$company = Company::findOrFail($id); 


// this uses the active company record and gets the managers based 
// on the current company
$managers = $company->managers;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...