Accès à une relation BelongsToMany sur plusieurs bases de données dans Laravel
Lorsque vous travaillez avec des modèles stockés dans différentes bases de données, vous pouvez rencontrer des problèmes avec la relation BelongsToMany de Laravel lorsque le tableau croisé dynamique n'est pas dans la même base de données que le modèle cible. Pour pallier à cela, il est nécessaire de spécifier explicitement le nom de la base de données du tableau croisé dynamique.
Pour ce faire, modifiez la relationappartenanceToMany dans le modèle qui contient le tableau croisé dynamique comme suit :
<code class="php">public function bs() { $database = $this->getConnection()->getDatabaseName(); return $this->belongsToMany('B', "$database.a_bs", 'a_id', 'b_id'); }</code>
Cette approche garantit que Laravel recherche le tableau croisé dynamique dans la base de données correspondant au modèle contenant la relation, résolvant ainsi le problème.
Cependant, si votre projet utilise des bases de données SQLite et que vous avez l'intention d'exécuter des tests unitaires, des considérations supplémentaires sont nécessaires. SQLite nécessite d'attacher la base de données cible à la connexion de test pour faciliter l'accès au tableau croisé dynamique. Ceci peut être réalisé avec le code suivant :
<code class="php">public function bs() { $database = $this->getConnection()->getDatabaseName(); if (is_file($database)) { $connection = app('B')->getConnection()->getName(); $name = $this->getConnection()->getName(); \Illuminate\Support\Facades\DB::connection($connection)->statement("ATTACH DATABASE '$database' AS $name"); $database = $name; } return $this->belongsToMany('B', "$database.a_bs", 'a_id', 'b_id'); }</code>
Il est important d'être attentif à l'utilisation des transactions. Si la connexion actuelle utilise des transactions, l'instruction ATTACH DATABASE échouera. A l'inverse, si la connexion associée utilise des transactions, les données résultantes seront masquées de la connexion actuelle.
Pour nettoyer après votre base de données attachée, vous pouvez soit exécuter un rollback de migration, soit tronquer les tables tout en préservant leur structure.
D'autres options incluent la copie de la base de données jointe dans un fichier temporaire et le remplacement de la source après le test ou l'utilisation de la nature facilement accessible des fichiers de base de données SQLite.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!