Mis mesas:

Usuarios:

id fname email

Marcas:

id title user_id_made

Cada marca tiene una user_id_made que es una foreign key de users tabla.

En el modelo Brand:

public function user()
{
    return $this->hasOne('App\Models\User','id');
}

En modelo de usuario:

public function brand()
{
    return $this->belongsTo('App\Models\Brand','user_id_made');
}

Tengo una lista de marcas como esta:

title of brand       -   email of user that made it   

En mi controlador escribo este código:

$data['brands']  = Brand::with('user')->simplePaginate(2);

En foreach de vista recibí trying to get non-object property error:

            @foreach($brands as $brand)



                <tr>
                 <td>{{$brand->title_fa}}</td>
                 <td>{{$brand->title_en}}</td>
                 <td>{{$brand->user->fname}}</td> // error line
0
S.M_Emamian 28 sep. 2016 a las 07:51

3 respuestas

La mejor respuesta

Esto le dará el título de la marca y el correo electrónico del usuario con esta marca.

$brands=Brand::with('user')->get();
foreach($brands as $brand)
{
    print_r($brand->title);
    print_r($brand->user->email);
}

La relación en el modelo de marca:

public function user()
{
    return $this->hasOne('App\Models\User','user_id_made');
}
1
Sanzeeb Aryal 28 sep. 2016 a las 05:06

Dado que el modelo de marca tiene la clave externa, este es el lado que El método belongsTo() debería ser.

Si usaras la convención al nombrar tu clave externa user_id, las cosas serían Sea más sencillo.

Pero si por alguna razón necesita tener el nombre user_id_made para la columna,

Esto es lo que debería pasar como un segundo argumento en ambos lados de la relación.

El User debe tener el hasOne('App\Brand', 'user_id_made').

Y el Brand debería tener belongsTo('App\User', 'user_id_made').

https://laravel.com/docs/5.3/eloquent-relationships

0
orestiss 28 sep. 2016 a las 07:49

Has utilizado la relación incorrecta. hasOne se usa en relaciones de uno a uno, pero debe ser una relación de uno a muchos entre su Brand y User. (Cada marca está hecha por un usuario y cada usuario puede hacer más de una marca)

Si dices que una Brand hasOne User, Laravel asumirá que la tabla users tiene una clave externa que hace referencia a la tabla brands.

En su lugar, modifique su método de relación para usar belongsTo.

public function user() {
    return $this->belongsTo('App\Models\User', 'user_id_made');
}
0
Michael Chan 28 sep. 2016 a las 07:32