2017-09-29 4 views
2

J'utilise le module SQLite d'Expo dans mon projet natif réactif. J'ai deux tables, (messages et utilisateurs):L'ID de la table est remplacé par l'ID de la clé étrangère

CREATE TABLE IF NOT EXISTS messages (
    id text not null, 
    sender_id integer, 
    thread_id integer, 
    body text, 
    foreign key (sender_id) references users (id), 
    foreign key (thread_id) references threads (id) 
); 

CREATE TABLE IF NOT EXISTS users (
    id integer primary key, 
    first_name text, 
    last_name text, 
    email text 
); 

Et si j'insère des messages:

INSERT INTO messages (id, sender_id, thread_id, body) values ('xeieoef-ee, 3, 1, 'test'); 
INSERT INTO messages (id, sender_id, thread_id, body) values ('ttrefzr-ry, 3, 1, 'payload'); 

Je voudrais obtenir en comparant l'identifiant de fil de tous les messages, y compris les données de ses utilisateurs. Voilà comment je suis Interrogation:

select * from messages, users where thread_id = 2 AND messages.sender_id = users.id; 

Cependant, il en résulte à la fois l'identifiant du message et l'ID utilisateur d'être le même:

[ 
    { 
     "body": "test", 
     "email": "[email protected]", 
     "first_name": "userThreeF", 
     "id": 3, 
     "last_name": "threeUserL", 
     "sender_id": 3, 
     "thread_id": 1, 
    }, 
    { 
     "body": "payload", 
     "email": "[email protected]", 
     "first_name": "userThreeF", 
     "id": 3, 
     "last_name": "threeUserL", 
     "sender_id": 3, 
     "thread_id": 1, 
    }, 
] 

au lieu de l'identifiant de message à avoir son propre identifiant, est le message id est l'identifiant de l'expéditeur. Qu'est-ce que je fais mal ici?

Code de mise à jour

J'ai un bouton dans l'application qui onpress envoie les données à la fonction de la MessageStore.

sendText =() => { 
    const {MessageStore, UserStore, SocketStore} = this.props; 
    const data = { 
     id: uuid.v4(), 
     sender_id: UserStore.userInfo.user.id, 
     thread_id: 1, 
     body: this.state.text, 
    } 
    MessageStore.addMessageToDB(data); 
} 

Sur le magasin, le message est ajouté à la base de données par le addMessageToDB(), qui appelle à nouveau la getMessageFromDatabase() pour obtenir tous les messages.

@action addMessageToDB = (payload) => { 
    db.transaction(
     tx => { 
      tx.executeSql(
       `INSERT INTO messages 
        (id, sender_id, thread_id, body, status) values (?, ?, ?, ?, ?);`, 
       [payload.id, payload.sender_id, payload.thread_id, payload.body, "pending"], 
       (tx, results) => { 
        console.log('message insertion success') 
       }, 
       (tx, error) => console.log('message insertion error', error) 
      ); 
      this.getMessageFromDatabase(payload.thread_id); 
     } 
    ) 
} 

@action getMessageFromDatabase = (payload) => { 
    console.log('>>> getMessageFromDatabase payload', payload); 
    db.transaction(
     tx => { 
      tx.executeSql(
       `select * from messages inner join users on messages.sender_id=users.id where thread_id = ?;`, [payload], 
       (tx, {rows}) => { 
        console.log('inner join success', rows._array); 
       }, 
       (tx, error) => console.log('inner join error', error), 
      ); 
     } 
    ) 
} 
+0

Intéressant. J'ai essayé de reproduire le code en collation et j'ai les mêmes résultats. Voici le [lien expo] (https://snack.expo.io/Hy9l69jo-) – Kakar

+0

@Kakar Oui! C'est tout. Aucune idée de ce qui ne va pas ici. –

Répondre

0

Modifier avec une solution:

Les deux tables ont une colonne 'id', de sorte que le nom d'utilisateur est l'identifiant du écrasant message.

Cela a fonctionné: select messages.*, users.first_name, users.last_name, users.email from messages inner join users on messages.sender_id=users.id where thread_id = ?;

+0

Désolé, mais les résultats sont les mêmes. –

+0

Nous aurons besoin de voir du code alors, je ne pense pas qu'il y ait quelque chose de mal avec ce que vous avez posté ici – Lucas

+0

Salut! J'ai mis à jour la question avec le code pertinent. Pourriez-vous s'il vous plaît jeter un coup d'oeil. –