laravel - relations - Eloquent hasOne vs belongsTo degenera a la misma función si se especifican ambas claves?
uno a muchos en laravel (1)
Sí, funciona en algunos casos para especificar las claves y hacer que la relación funcione. Y en algunos casos me refiero principalmente a la recuperación de resultados. Aquí hay un ejemplo:
DB
users profiles
----- --------
id id
etc... user_id
etc...
Modelos
Usar relaciones "incorrectas" con hasOne
dos veces
class User extends Eloquent {
public function profile(){
return $this->hasOne(''Profile'');
}
}
class Profile extends Eloquent {
public function user(){
return $this->hasOne(''User'', ''id'', ''user_id'');
}
}
Consultas
Digamos que queríamos obtener el usuario de un cierto perfil
$profile = Profile::find(1);
$user = $profile->user;
Esto está funcionando. Pero no está funcionando como se supone que debe ser. Tratará la clave principal de los users
como una clave externa que hace referencia a user_id
en los profiles
.
Y aunque esto puede funcionar, te meterás en problemas cuando uses métodos de relación más complicados.
Por ejemplo, associate
:
$user = User::find(1);
$profile = Profile::find(2);
$profile->user()->associate($user);
$profile->save();
La llamada lanzará una excepción porque HasOne
no tiene el método associate
. ( BelongsTo
tiene BelongsTo
)
Conclusión
Mientras que belongsTo
y hasOne
pueden comportarse de manera similar en algunas situaciones. Ellos claramente no. Interacciones más complejas con la relación no funcionarán y no tiene sentido desde un punto de vista semántico.
En el caso de una relación uno a uno, si especifico completamente las claves en las llamadas a métodos, ¿hay alguna diferencia entre las relaciones hasOne
y belongsTo
? O, preguntado de manera diferente, si utilicé hasOne
en ambos lados de la relación, ¿sería el mismo resultado?