0
votes

Si la relation n'existe pas, utilisez la relation parent

Dans mon application, j'ai des jeux et des tournois, avec un jeu qui appartient éventuellement à un tournoi. Le jeu et le tournoi peuvent avoir une relation d'appartenance avec une photoalbum.

Ce que je veux maintenant, c'est si un jeu n'a pas de photoalbum, il essaiera de retourner la photoalbum du tournoi (si ces deux choses existent). Je veux aussi que cela prenne cet itinéraire si je fais une requête en utilisant withcount .

J'ai essayé d'ajouter les chèques dans la relation d'album du jeu, mais cela ne semblait pas fonctionner: < / p> xxx

doit fonctionner avec sans encombrement () dans le constructeur de requêtes , et ne me traduisez pas pour écrire un tout tas de nouveau si / puis vérifie tout au long du code existant.

-

moins préoccupé par le sans fonctionnement car je peux faire une propriété personnalisée qui Fonctionne sur album_count .


2 commentaires

Liée à: Stackoverflow.com/a/35445603/3047297


C'est si frustrant, mais cette deuxième requête ne ferait pas capter ce que je devrais pouvoir correspondre correctement!


3 Réponses :


0
votes

Vous pouvez faire comme ceci ci-dessous

$game = Game::find(1);

if(! isset($game->album)) { // you can different if's here to check if not album exist
   return $game->tournament->album;
} 


1 commentaires

Ne fonctionne pas avec la requête withcount , et je ne veux pas écrire 50 si des déclarations tout au long de mon application



0
votes

Avez-vous essayé un hasonethrough code> relation?

public function tournamentAlbum(): HasOneThrough
{
    return $this->hasOneThrough(Album::class, Tournament::class);
}


1 commentaires

J'ai effectivement oublié Hasonethrough existait, mais oui, pas de chance ici en raison de charges impatientes



0
votes

Je déteste être ce gars qui répond à sa propre question, mais je déteste être le gars qui ne partage pas ce qui a fonctionné plus.

J'ai fini par créer une vue qui fait la jointure et vérifiez au niveau des données. . Cela a fait cela un simple rejoindre code> et un ifnull code>, puis changeez mon modèle pour utiliser cette table au lieu de la base. Cela fonctionne de manière à lire et à interroger, mais évidemment pas pour les opérations de crud. P>

Étant donné que cette vue n'est pas mise à jour, j'ai fini par appuyer sur le système d'événements de modèles pour changer le modèle à la table de base lors de la préparation à Faites des écrires puis de retour quand c'est fait. Je suis allé avec le modèle d'observateur car il garde tout ce qui est bien et propre. P>

L'observateur: p> xxx pré>

le contrat / interface IPERSISTTO P>

Game::Observe(PersistToObserver::class);


0 commentaires