php - validar - Laravel comprobar si existe modelo relacionado
validar si un registro existe en la base de datos laravel (7)
Tengo un modelo Eloquent que tiene un modelo relacionado:
public function option() {
return $this->hasOne(''RepairOption'', ''repair_item_id'');
}
public function setOptionArrayAttribute($values)
{
$this->option->update($values);
}
cuando creo el modelo, no necesariamente tiene un modelo relacionado. Cuando lo actualizo, podría agregar una opción, o no.
Entonces necesito verificar si el modelo relacionado existe, ya sea para actualizarlo o crearlo, respectivamente:
$model = RepairItem::find($id);
if (Input::has(''option'')) {
if (<related_model_exists>) {
$option = new RepairOption(Input::get(''option''));
$option->repairItem()->associate($model);
$option->save();
$model->fill(Input::except(''option'');
} else {
$model->update(Input::all());
}
};
Donde <related_model_exists>
es el código que estoy buscando.
Como Hemerson Varela ya dijo en Php 7.1 count(null)
lanzará un error
y hasOne
devuelve null
si no hay fila. Como tiene una relación hasOne
, usaría el método empty
para verificar:
$model = RepairItem::find($id);
if (!empty($temp = $request->input(''option''))) {
$option = $model->option;
if(empty($option)){
$option = $user->expertise()->create();
}
$option->someAttribute = temp;
$option->save();
};
Después de Php 7.1 , la respuesta aceptada no funcionará para todos los tipos de relaciones.
Debido a que dependiendo del tipo de relación, Eloquent devolverá una Collection
, un Model
o Null
. Y en Php 7.1 count(null)
arrojará un error
.
Entonces, para verificar si existe la relación, puede usar:
Para relaciones individuales: por ejemplo hasOne
y belongsTo
if(!is_null($model->relation)) {
....
}
Para relaciones múltiples: Por ejemplo: hasMany
y belongsToMany
if ($model->relation->isNotEmpty()) {
....
}
No estoy seguro de si esto ha cambiado en Laravel 5, pero la respuesta aceptada usando count($data->$relation)
no funcionó para mí, ya que el solo hecho de acceder a la propiedad de la relación provocó que se cargara.
Al final, un isset($data->$relation)
sencillo isset($data->$relation)
funcionó para mí.
Prefiero usar el método de exists
:
RepairItem::find($id)->option()->exists()
para verificar si el modelo relacionado existe o no. Está funcionando bien en Laravel 5.2
Puede usar el método relationLoaded en el objeto modelo. Esto me salvó el tocino, así que espero que ayude a alguien más. Me hicieron esta sugerencia cuando hice la misma pregunta en Laracasts.
Un objeto de relación pasa llamadas de método desconocido a un generador de consultas elocuentes , que está configurado para seleccionar solo los objetos relacionados. Ese generador, a su vez, pasa llamadas de método desconocidas a su generador de consultas subyacente.
Esto significa que puede usar los métodos exists()
o count()
directamente desde un objeto de relación:
$model->relation()->exists(); // bool: true if there is at least one row
$model->relation()->count(); // int: number of related rows
Observe los paréntesis después de la relation
: ->relation()
es una llamada a la función (obtener el objeto de relación), en oposición a ->relation
que Laravel le asignó a un comprador de propiedades mágicas (obteniendo el objeto u objetos relacionados).
Usar el método de count
en el objeto de relación (es decir, usar los paréntesis) será mucho más rápido que hacer $model->relation->count()
o count($model->relation)
(a menos que la relación ya haya sido ansiosa) cargado) ya que ejecuta una consulta de recuento en lugar de extraer todos los datos de objetos relacionados de la base de datos, solo para contarlos. Del mismo modo, el uso de exists
tampoco necesita extraer datos del modelo.
Tanto exists()
como count()
funcionan en todos los tipos de relaciones que he probado, por lo que al menos belongsTo
, hasOne
, hasMany
y belongsToMany
.
solución genérica trabajando en todos los tipos de relación (pre php 7.2):
if (count($model->relation))
{
// exists
}
Esto funcionará para todas las relaciones, ya que las propiedades dinámicas devuelven Model
o Collection
. Ambos implementan ArrayAccess
.
Entonces dice así:
relaciones individuales: hasOne
/ belongsTo
/ morphTo
/ morphOne
// no related model
$model->relation; // null
count($model->relation); // 0 evaluates to false
// there is one
$model->relation; // Eloquent Model
count($model->relation); // 1 evaluates to true
muchas relaciones: hasMany
/ belongsToMany
/ morphMany
/ morphToMany
/ morphedByMany
// no related collection
$model->relation; // Collection with 0 items evaluates to true
count($model->relation); // 0 evaluates to false
// there are related models
$model->relation; // Collection with 1 or more items, evaluates to true as well
count($model->relation); // int > 0 that evaluates to true