Maison > base de données > tutoriel mysql > Comment accéder à une relation BelongsToMany sur plusieurs bases de données dans Laravel ?

Comment accéder à une relation BelongsToMany sur plusieurs bases de données dans Laravel ?

Barbara Streisand
Libérer: 2024-11-03 07:53:03
original
691 Les gens l'ont consulté

How to Access a BelongsToMany Relationship Across Multiple Databases in Laravel?

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal