J'ai diverses relations au sein de mon Eloquent
Models
qui ressemblent à ceci:Laravel Eloquent - Ne pas exécuter la requête de la relation si la valeur de la colonne est NULL ou 0
public function main_image()
{
return $this->hasOne(Media::class, 'id', 'main_image_id');
}
Cependant, il exécutera une requête SQL si le main_image_id
est null ou 0, donc je finis avec un certain nombre de questions comme ceci:
select * from `media` where `media`.`id` is null and `media`.`id` is not null limit 1
qui, évidemment, ne retournera rien, mais gaspille encore des ressources. Y a-t-il un moyen de vérifier automatiquement cela?
Actuellement ce que je fais est d'avoir une méthode, comme hasMainImage()
, qui vérifie que main_image_id
n'est pas nul et pas 0, mais une grande partie du système actuel utilise déjà les relations, et je me demandais si je pouvais ajouter la vérification à la méthode relationnelle elle-même?
J'ai essayé d'ajouter un chèque et retourner null
si la colonne n'a pas de valeur réelle, mais j'ai un Exception
qu'il doit retourner un objet Relation. Ou si je suis en train de charger Eager, je reçois l'erreur suivante:
Call to a member function addEagerConstraints() on null
public function main_image()
{
if (!$this->main_image_id) {
return null;
}
return $this->hasOne('App\Modules\Media\Models\Media', 'id', 'main_image_id');
}
Merci pour votre aide!
EDIT: A peut-être plus clair exemple:
$page = Page::find(1);
var_dump($page->main_image); // This will run a query as shown above that is guaranteed to return nothing
// Since at this point system knows that $page->main_image_id is 0 or null, I would like to use that to not run the query and automatically set $page->main_image to null
Faire un 'with' utilise des ressources supplémentaires. Vous ne devriez pas le faire en premier lieu, ne pas le faire partout et ensuite essayer de le contourner. – apokryfos
'with' n'est pas utilisé partout, uniquement lorsque plusieurs modèles sont chargés en même temps. Lorsqu'une seule instance est chargée, 'with 'n'est pas utilisé et des appels comme' $ page-> main_image' sont effectués. Ce sont les appels que j'essaie d'optimiser ici – Giedrius
Il n'y a aucun avantage supplémentaire si vous faites cela. La jointure se produira de toute façon, cela retournera juste moins de choses. Je suppose bien sûr que vous avez une relation un-à-un ici. – apokryfos