Soy realmente nuevo trabajando con laravel 5.0, así que tuve este problema cuando trato de recuperar un resultado usando un modelo. Tengo una tabla de usuarios, con una lista de usuarios que pueden ser gerentes o no, pueden haber asignado una o más compañías, o ninguna, una tabla de compañías con compañías que pueden tener uno o más gerentes, y una tabla dinámica que yo llamadas compañías_gerentes. Configuré las relaciones en cada modelo así:

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

Y la misma en modelo de empresa.

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

Quiero que los gerentes se asignen a una compañía usando una identificación de la compañía para obtenerlo, pero solo me dio un gran objeto sin los valores que estaba buscando (los nombres de los gerentes asignados a esa compañía). Este es el código que probé:

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

Agradecería cualquier ayuda que me puedan dar

0
argenis95 14 sep. 2018 a las 21:08

3 respuestas

La mejor respuesta

El uso de ->managers() (con los corchetes) en realidad no devuelve los administradores asociados, sino más bien una instancia de Builder (el "objeto enorme"), que luego puede encadenar con parámetros adicionales antes de finalmente recuperarlos con ->get() (u otro cierre, como ->first(), ->paginate(), etc.)

Usando ->managers (sin los corchetes), intentará acceder a los administradores asociados y ejecutará cualquier lógica adicional para recuperarlos.

Entonces, tienes 2 opciones:

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

O

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

Ambos realizarán la lógica necesaria para atraer a los gerentes. ->with() y sin paréntesis es un poco más eficiente, hacerlo todo en una sola consulta, así que tenlo en cuenta.

1
Tim Lewis 14 sep. 2018 a las 18:17

Gracias por su ayuda chicos, resolví el problema arreglando las relaciones en los modelos para esto:

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

Y esto

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

Los ID que había configurado no eran los correctos para la función pertenece a muchos

Y esto

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

También fue un problema, fue un error tonto de mi parte. Resolví el retorno de la instancia de Builder usando solo return en lugar de dd (), de esa manera obtuve los valores que estaba buscando. ¡Gracias a todos!

0
argenis95 14 sep. 2018 a las 19:03

Solo necesita dividir su código;

// 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;
0
Simon R 14 sep. 2018 a las 18:12