Objectrelationele mapping voor fibjs
Installeren
1npm install fib-orm
Test
1npm run ci
DBMS-ondersteuning
- MySQL en MariaDB
- SQLiet
Functies
fib-orm voegt een set synchrone versiemethoden toe aan het knooppunt-orm-object.
Invoering
Dit is een fibjs-object relationele mappingmodule.
Een voorbeeld:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37var orm = require("fib-orm");
var db = orm.connectSync("mysql://username:password@host/database");
var Person = db.define("person", {
name : String,
surname : String,
age : Number, // FLOAT
male : Boolean,
continent : [ "Europe", "America", "Asia", "Africa", "Australia", "Antartica" ], // ENUM type
photo : Buffer, // BLOB/BINARY
data : Object // JSON encoded
}, {
methods: {
fullName: function () {
return this.name + ' ' + this.surname;
}
},
validations: {
age: orm.enforce.ranges.number(18, undefined, "under-age")
}
});
// add the table to the database
db.syncSync();
// add a row to the person table
Person.createSync({ id: 1, name: "John", surname: "Doe", age: 27 });
// query the person table by surname
var people = Person.findSync({ surname: "Doe" });
// SQL: "SELECT * FROM person WHERE surname = 'Doe'"
console.log("People found: %d", people.length);
console.log("First person: %s, age %d", people[0].fullName(), people[0].age);
people[0].age = 16;
people[0].saveSync();
De node.js-versie ziet er als volgt uit:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49var orm = require("orm");
orm.connect("mysql://username:password@host/database", function (err, db) {
if (err) throw err;
var Person = db.define("person", {
name : String,
surname : String,
age : Number, // FLOAT
male : Boolean,
continent : [ "Europe", "America", "Asia", "Africa", "Australia", "Antartica" ], // ENUM type
photo : Buffer, // BLOB/BINARY
data : Object // JSON encoded
}, {
methods: {
fullName: function () {
return this.name + ' ' + this.surname;
}
},
validations: {
age: orm.enforce.ranges.number(18, undefined, "under-age")
}
});
// add the table to the database
db.sync(function(err) {
if (err) throw err;
// add a row to the person table
Person.create({ id: 1, name: "John", surname: "Doe", age: 27 }, function(err) {
if (err) throw err;
// query the person table by surname
Person.find({ surname: "Doe" }, function (err, people) {
// SQL: "SELECT * FROM person WHERE surname = 'Doe'"
if (err) throw err;
console.log("People found: %d", people.length);
console.log("First person: %s, age %d", people[0].fullName(), people[0].age);
people[0].age = 16;
people[0].save(function (err) {
// err.msg = "under-age";
});
});
});
});
});
Documentatie
Fibjs heeft geen nieuwe functies toegevoegd, de ontwikkeling van documenten kan verwijzen naar node-orm, je hoeft alleen de asynchrone aanroep naar de synchrone versie te veranderen.wiki .
Instellingen
Zie informatie in de wiki .
Verbinden
Zie informatie in de wiki .
Modellen
Een model is een abstractie over een of meer databasetabellen. Modellen ondersteunen associaties (meer hieronder). Er wordt aangenomen dat de naam van het model overeenkomt met de tabelnaam.
Modellen ondersteunen gedrag voor het benaderen en manipuleren van tabelgegevens.
Modellen definiëren
Zie informatie in de wiki .
Properties
Zie informatie in de wiki .
Instance Methods
Worden doorgegeven tijdens de modeldefinitie.
1
2
3
4
5
6
7
8
9
10
11
12
13var Person = db.define('person', {
name : String,
surname : String
}, {
methods: {
fullName: function () {
return this.name + ' ' + this.surname;
}
}
});
var person = Person.getSync(4);
console.log( person.fullName() );
Model Methods
Worden rechtstreeks op het model gedefinieerd.
1
2
3
4
5
6
7
8
9var Person = db.define('person', {
name : String,
height : { type: 'integer' }
});
Person.tallerThan = function(height) {
return this.findSync({ height: orm.gt(height) });
};
var tallPeople = Person.tallerThan( 192);
Modellen laden [GEEN ONDERSTEUNING]
Modellen kunnen zich in afzonderlijke modules bevinden. Zorg er eenvoudigweg voor dat de module die de modellen bevat, module.exports gebruikt om een functie te publiceren die de databaseverbinding accepteert, en laad vervolgens uw modellen zoals u dat wilt.
Let op: met deze techniek kunt u trapsgewijze belastingen realiseren.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20// your main file (after connecting)
db.loadSync("./models");
// loaded!
var Person = db.models.person;
var Pet = db.models.pet;
// models.js
module.exports = function (db) {
db.loadSync("./models-extra");
db.define('person', {
name : String
});
};
// models-extra.js
module.exports = function (db) {
db.define('pet', {
name : String
});
};
Modellen synchroniseren
Zie informatie in de wiki .
Modellen laten vallen
Zie informatie in de wiki .
Geavanceerde mogelijkheden
Met ORM2 kunt u een aantal geavanceerde aanpassingen aan uw modeldefinities uitvoeren. U kunt deze configureren via de instellingen of in de aanroep naar define
wanneer u het model instelt.
Elke Model-instantie heeft bijvoorbeeld een unieke ID in de database. Deze tabelkolom wordt automatisch toegevoegd en wordt standaard 'id' genoemd.
Als u uw eigen key: true
kolom definieert, wordt 'id' niet toegevoegd:
1
2
3
4
5
6
7
8
9
10
11
12var Person = db.define("person", {
personId : { type: 'serial', key: true },
name : String
});
// You can also change the default "id" property name globally:
db.settings.set("properties.primary_key", "UID");
// ..and then define your Models
var Pet = db.define("pet", {
name : String
});
Het huisdiermodel heeft 2 kolommen, een UID
en een name
.
Het is ook mogelijk om samengestelde sleutels te hebben:
1
2
3
4var Person = db.define("person", {
firstname : { type: 'text', key: true },
lastname : { type: 'text', key: true }
});
Andere opties:
identityCache
: (standaard:false
) Stel dit intrue
om identiteitscache in te schakelen ( Singletons ) of stel een time-outwaarde in (in seconden);autoSave
: (standaard:false
) Stel dit zo in dattrue
een exemplaar direct wordt opgeslagen nadat een eigenschap is gewijzigd;autoFetch
: (standaard:false
) Stel dit intrue
om associaties op te halen bij het ophalen van een exemplaar uit de database;autoFetchLimit
: (standaard:1
) AlsautoFetch
dit is ingeschakeld, definieert dit hoeveel borduurringen (associaties van associaties) u automatisch wilt ophalen.
Haken
Zie informatie in de wiki .
Voorwerpen vinden
Model.getSync(id, [ options ])
Om een specifiek element uit de database te halen, gebruikt u Model.get
.
1
2var person = Person.getSync(123);
// finds person with id = 123
Model.findSync([ conditions ] [, options ] [, limit ] [, order ])
Het vinden van een of meer elementen heeft meer opties, elk element kan in geen specifieke parametervolgorde worden opgegeven, maar options
hoeft alleen maar na te zijn conditions
(zelfs als het een leeg object is).
1
2var people = Person.findSync({ name: "John", surname: "Doe" }, 3);
// finds people with name='John' AND surname='Doe' and returns the first 3
Als u de resultaten moet sorteren omdat u ze beperkt of gewoon omdat u ze gesorteerd wilt hebben, doet u het volgende:
1
2
3
4
5
6var people = Person.findSync({ surname: "Doe" }, "name");
// finds people with surname='Doe' and returns sorted by name ascending
people = Person.findSync({ surname: "Doe" }, [ "name", "Z" ]);
// finds people with surname='Doe' and returns sorted by name descending
// ('Z' means DESC; 'A' means ASC - default)
Er zijn meer opties die je kunt doorgeven om iets te vinden. Deze opties worden doorgegeven in een tweede object:
1
2var people = Person.findSync({ surname: "Doe" }, { offset: 2 });
// finds people with surname='Doe', skips the first 2 and returns the others
U kunt bij het zoeken ook onbewerkte SQL gebruiken, zoals beschreven in het gedeelte Chaining hieronder.
Model.countSync([ conditions])
Als u alleen het aantal items wilt tellen dat aan een voorwaarde voldoet, kunt u dat gewoon gebruiken .count()
in plaats van ze allemaal te vinden en te tellen. Dit zal de databaseserver feitelijk vertellen een telling uit te voeren (dit gebeurt niet in het knooppuntproces zelf). ).
1
2var count = Person.countSync({ surname: "Doe" });
console.log("We have %d Does in our db", count);
Model.existsSync([ conditions])
Net als bij .count()
, controleert deze methode alleen of het aantal groter is dan nul of niet.
1
2var exists = Person.existsSync({ surname: "Doe" });
console.log("We %s Does in our db", exists ? "have" : "don't have");
Aggregating Functions
Er kunnen een Array
aantal eigenschappen worden doorgegeven om slechts enkele eigenschappen te selecteren. Een Object
wordt ook geaccepteerd om voorwaarden te definiëren.
Hier is een voorbeeld om te illustreren hoe u het kunt gebruiken .groupBy()
:
1
2
3//The same as "select avg(weight), age from person where country='someCountry' group by age;"
var stats = Person.aggregate(["age"], { country: "someCountry" }).avg("weight").groupBy("age").getSync();
// stats is an Array, each item should have 'age' and 'avg_weight'
Basismethoden .aggregate()
_
.limit()
: u kunt een getal als limiet doorgeven, of twee getallen als respectievelijk offset en limiet.order()
: hetzelfde alsModel.find().order()
Aanvullende .aggregate()
methoden
min
max
avg
sum
count
(er is een snelkoppeling naar dit -Model.count
)
Er zijn meer aggregatiefuncties, afhankelijk van de bestuurder (bijvoorbeeld Wiskundige functies).
Chaining
Als u de voorkeur geeft aan een minder gecompliceerde syntaxis, kunt u een keten vormen .find()
door geen callback-parameter op te geven.
1
2
3var people = Person.find({ surname: "Doe" }).limit(3).offset(2).only("name", "surname").runSync();
// finds people with surname='Doe', skips first 2 and limits to 3 elements,
// returning only 'name' and 'surname' properties
Als u slechts één of twee eigenschappen wilt overslaan, kunt u bellen .omit()
in plaats van .only
.
Door ketenvorming zijn ingewikkeldere zoekopdrachten mogelijk. We kunnen bijvoorbeeld zoeken door aangepaste SQL op te geven:
1Person.find({ age: 18 }).where("LOWER(surname) LIKE ?", ['dea%']).allSync( ... );
Het is een slechte gewoonte om handmatig aan SQL-parameters te ontsnappen, omdat dit foutgevoelig is en uw applicatie wordt blootgesteld aan SQL-injectie. De ?
syntaxis zorgt ervoor dat u kunt ontsnappen, door het vraagteken in de query veilig te vervangen door de opgegeven parameters. U kunt ook meerdere where
clausules aan elkaar koppelen nodig zijn.
.find
, .where
& .all
doen hetzelfde; ze zijn allemaal uitwisselbaar en aan elkaar te koppelen.
U kunt ook order
of orderRaw
:
1
2
3Person.find({ age: 18 }).order('-name').allSync( ... );
// see the 'Raw queries' section below for more details
Person.find({ age: 18 }).orderRaw("?? DESC", ['age']).allSync( ... );
Je kunt ook ketenen en uiteindelijk gewoon de telling krijgen. In dit geval worden offset, limiet en volgorde genegeerd.
1
2var people = Person.find({ surname: "Doe" }).countSync();
// people = number of people with surname="Doe"
Ook beschikbaar is de optie om de geselecteerde items te verwijderen. Houd er rekening mee dat een geketende verwijdering geen haken oplevert.
1
2Person.find({ surname: "Doe" }).removeSync();
// Does gone..
U kunt ook wijzigingen aanbrengen in uw instances met behulp van de gebruikelijke Array-traversal-methoden en uiteindelijk alles opslaan.
1
2
3
4
5
6
7
8
9
10
11
12
13Person.find({ surname: "Doe" }).each(function (person) {
person.surname = "Dean";
}).save(function (err) {
// done!
});
Person.find({ surname: "Doe" }).each().filter(function (person) {
return person.age >= 18;
}).sort(function (person1, person2) {
return person1.age < person2.age;
}).get(function (people) {
// get all people with at least 18 years, sorted by age
});
Natuurlijk kun je dit direct op doen .find()
, maar voor wat ingewikkelder taken kan dit erg handig zijn.
Model.find()
retourneert geen array, dus je kunt niet zomaar direct een keten vormen. Om te beginnen met ketenen moet je bellen
.each()
(met een optionele callback als je de lijst wilt doorlopen). Je kunt dan de algemene functies gebruiken
.filter()
, .sort()
en .forEach()
meer dan eens.
Op het einde (of tijdens het proces..) kunt u bellen met:
.countSync()
als je gewoon wilt weten hoeveel items er zijn;.getSync()
om de lijst op te halen;.saveSync()
om alle itemwijzigingen op te slaan.
Voorwaarden
Voorwaarden worden gedefinieerd als een object waarbij elke sleutel een eigenschap is (tabelkolom). Alle sleutels moeten worden samengevoegd door de logische AND
. Waarden worden geacht exact overeen te komen, tenzij u een . doorgeeft Array
. In dit geval wordt er rekening mee gehouden een lijst om de woning mee te vergelijken.
1
2{ col1: 123, col2: "foo" } // `col1` = 123 AND `col2` = 'foo'
{ col1: [ 1, 3, 5 ] } // `col1` IN (1, 3, 5)
Als je andere vergelijkingen nodig hebt, moet je een speciaal object gebruiken dat door een aantal helperfuncties is gemaakt. Hier zijn een paar voorbeelden om het te beschrijven:
1
2
3
4
5
6
7
8
9
10
11{ col1: orm.eq(123) } // `col1` = 123 (default)
{ col1: orm.ne(123) } // `col1` <> 123
{ col1: orm.gt(123) } // `col1` > 123
{ col1: orm.gte(123) } // `col1` >= 123
{ col1: orm.lt(123) } // `col1` < 123
{ col1: orm.lte(123) } // `col1` <= 123
{ col1: orm.between(123, 456) } // `col1` BETWEEN 123 AND 456
{ col1: orm.not_between(123, 456) } // `col1` NOT BETWEEN 123 AND 456
{ col1: orm.like(12 + "%") } // `col1` LIKE '12%'
{ col1: orm.not_like(12 + "%") } // `col1` NOT LIKE '12%'
{ col1: orm.not_in([1, 4, 8]) } // `col1` NOT IN (1, 4, 8)
Ruwe zoekopdrachten
1
2
3
4
5
6
7
8
9
10
11
12
13var data = db.driver.execQuerySync("SELECT id, email FROM user")
// You can escape identifiers and values.
// For identifier substitution use: ??
// For value substitution use: ?
var data = db.driver.execQuerySync(
"SELECT user.??, user.?? FROM user WHERE user.?? LIKE ? AND user.?? > ?",
['id', 'name', 'name', 'john', 'id', 55])
// Identifiers don't need to be scaped most of the time
var data = db.driver.execQuerySync(
"SELECT user.id, user.name FROM user WHERE user.name LIKE ? AND user.id > ?",
['john', 55])
Identity pattern
U kunt het identiteitspatroon gebruiken (standaard uitgeschakeld). Indien ingeschakeld, zullen meerdere verschillende zoekopdrachten resulteren in hetzelfde resultaat - u krijgt hetzelfde object. Als u andere systemen heeft die uw database kunnen wijzigen of als u een handleiding moet raadplegen Voor SQL-query's kunt u deze functie beter niet gebruiken. Het is ook bekend dat deze problemen kan veroorzaken bij complexe autofetch-relaties. Gebruik op eigen risico.
Het kan per model worden in-/uitgeschakeld:
1
2
3
4
5var Person = db.define('person', {
name : String
}, {
identityCache : true
});
en ook mondiaal:
1
2var db = orm.connectSync('...');
db.settings.set('instance.identityCache', true);
De identiteitscache kan worden geconfigureerd om na een bepaalde tijd te verlopen door een getal door te geven in plaats van een Booleaanse waarde. Het getal wordt beschouwd als de time-out van de cache in seconden (je kunt drijvende komma gebruiken).
Opmerking : een uitzondering op caching is dat het niet wordt gebruikt als een exemplaar niet is opgeslagen. Als u bijvoorbeeld een persoon ophaalt en deze vervolgens wijzigt, wordt deze niet vanuit de cache doorgegeven terwijl deze niet wordt opgeslagen.
Artikelen maken
Model.createSync(items)
Om nieuwe elementen in de database in te voegen, gebruikt u Model.create
.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15var items = Person.createSync([
{
name: "John",
surname: "Doe",
age: 25,
male: true
},
{
name: "Liza",
surname: "Kollan",
age: 19,
male: false
}
]);
// items - array of inserted items
Artikelen bijwerken
Elk geretourneerd item heeft de eigenschappen die voor het model zijn gedefinieerd en ook een aantal methoden die u kunt gebruiken om elk item te wijzigen.
1
2
3
4
5var John = Person.getSync(1);
John.name = "Joe";
John.surname = "Doe";
John.saveSync();
console.log("saved!");
Het bijwerken en vervolgens opslaan van een exemplaar kan in één keer worden gedaan:
1
2
3var John = Person.getSync(1);
John.saveSync({ name: "Joe", surname: "Doe" });
console.log("saved!");
Als u een exemplaar wilt verwijderen, doet u het volgende:
1
2
3
4// you could do this without even fetching it, look at Chaining section above
var John = Person.getSync(1);
John.removeSync();
console.log("removed!");
Validaties
Zie informatie in de wiki .
Verenigingen
Een associatie is een relatie tussen een of meer tabellen.
hasOne
Is een veel-op-een- relatie. Het is hetzelfde als waartoe behoort.
Bijvoorbeeld: Animal.hasOne('owner', Person)
Een
dier kan maar één eigenaar hebben, maar een persoon kan veel dieren hebben.
Aan dieren wordt de owner_id
eigenschap automatisch toegevoegd.
De volgende functies komen beschikbaar:
1
2
3
4animal.getOwnerSync() // Gets owner
animal.setOwnerSync(person) // Sets owner_id
animal.hasOwnerSync() // Checks if owner exists
animal.removeOwnerSync() // Sets owner_id to 0
Ketting zoeken
De hasOne-koppeling is ook compatibel met Chain Find. Met behulp van het bovenstaande voorbeeld kunnen we dit doen om toegang te krijgen tot een nieuw exemplaar van een ChainFind-object:
1Animal.findByOwner({ /* options */ })
Omgekeerde toegang
1Animal.hasOne('owner', Person, {reverse: 'pets'})
zal het volgende toevoegen:
1
2
3
4
5
6// Instance methods
person.getPetsSync(function..)
person.setPetsSync(cat, function..)
// Model methods
Person.findByPets({ /* options */ }) // returns ChainFind object
hasMany
Is een veel-op-veel- relatie (inclusief samenvoegingstabel).
Bijvoorbeeld: Patient.hasMany('doctors', Doctor, { why: String }, { reverse: 'patients', key: true })
Patiënt
kan veel verschillende artsen hebben. Elke arts kan veel verschillende patiënten hebben.
Hierdoor wordt een join-tabel gemaakt patient_doctors
wanneer u aanroept Patient.sync()
:
kolomnaam | type |
---|---|
patiënt_id | Geheel getal (samengestelde sleutel) |
dokter_id | Geheel getal (samengestelde sleutel) |
Waarom | Varchar(255) |
De volgende functies zullen beschikbaar zijn:
1
2
3
4
5
6
7
8
9
10
11
12patient.getDoctorsSync() // List of doctors
patient.addDoctorsSync(docs) // Adds entries to join table
patient.setDoctorsSync(docs) // Removes existing entries in join table, adds new ones
patient.hasDoctorsSync(docs) // Checks if patient is associated to specified doctors
patient.removeDoctorsSync(docs) // Removes specified doctors from join table
doctor.getPatientsSync()
etc...
// You can also do:
patient.doctors = [doc1, doc2];
patient.saveSync()
Om een arts aan een patiënt te koppelen:
1patient.addDoctorSync(surgeon, {why: "remove appendix"})
die wordt toegevoegd {patient_id: 4, doctor_id: 6, why: "remove appendix"}
aan de jointabel.
krijgAccessor
Deze accessor in dit type associatie retourneert ChainFind
een callback als deze niet wordt doorgegeven. Dit betekent dat u dingen kunt doen als:
1
2var doctors = patient.getDoctors().order("name").offset(1).runSync());
// ... all doctors, ordered by name, excluding first one
extendsTo
Als u optionele eigenschappen wilt opsplitsen in verschillende tabellen of verzamelingen, zal elke extensie in een nieuwe tabel staan, waarbij de unieke identificatie van elke rij de instantie-ID van het hoofdmodel is. Bijvoorbeeld:
1
2
3
4
5
6
7var Person = db.define("person", {
name : String
});
var PersonAddress = Person.extendsTo("address", {
street : String,
number : Number
});
Hiermee wordt een tabel gemaakt person
met kolommen id
en name
. De extensie maakt een tabel person_address
met kolommen person_id
, street
en number
. De beschikbare methoden in het Person
model zijn vergelijkbaar met een associatie. In dit voorbeeld zou u , , .. hasOne
kunnen aanroepen..getAddress(cb)
.setAddress(Address, cb)
Opmerking: u hoeft het resultaat van niet op te slaan Person.extendsTo
. Het retourneert een uitgebreid model. U kunt het gebruiken om rechtstreeks deze uitgebreide tabel te doorzoeken (en zelfs het gerelateerde model te vinden), maar dat is uw keuze. Als u er alleen toegang toe wilt hebben als u het originele model gebruikt, kunt u de retourzending gewoon weggooien.
Examples & options
Als je een relatie hebt van 1 tot n, gebruik dan hasOne
(behoort tot) associatie.
1
2
3
4
5
6
7
8
9
10
11
12
13var Person = db.define('person', {
name : String
});
var Animal = db.define('animal', {
name : String
});
Animal.hasOne("owner", Person); // creates column 'owner_id' in 'animal' table
// get animal with id = 123
var animal = Animal.getSync(123);
// animal is the animal model instance, if found
var person = animal.getOwnerSync();
// if animal has really an owner, person points to it
U kunt het owner_id
veld in de database als vereist markeren door de required
optie op te geven:
1Animal.hasOne("owner", Person, { required: true });
Als een veld niet verplicht is, maar gevalideerd moet worden, zelfs als het niet aanwezig is, specificeer dan de alwaysValidate
optie (dit kan bijvoorbeeld gebeuren als de validatie van een nulveld afhankelijk is van andere velden in het record).
1Animal.hasOne("owner", Person, { required: false, alwaysValidate: true });
Als u liever een andere naam voor het veld gebruikt (eigenaar_id), kunt u deze parameter in de instellingen wijzigen.
1db.settings.set("properties.association_key", "{field}_{name}"); // {name} will be replaced by 'owner' and {field} will be replaced by 'id' in this case
Opmerking: Dit moet worden gedaan voordat de koppeling wordt opgegeven.
De hasMany
associaties kunnen aanvullende eigenschappen hebben in de associatietabel.
1
2
3
4
5
6
7
8
9
10
11var Person = db.define('person', {
name : String
});
Person.hasMany("friends", {
rate : Number
}, {}, { key: true });
var John = Person.getSync(123);
var friends = John.getFriendsSync();
// assumes rate is another column on table person_friends
// you can access it by going to friends[N].extra.rate
Als u wilt, kunt u activeren autoFetch
, zodat associaties automatisch worden opgehaald wanneer u exemplaren van een model ophaalt of vindt.
1
2
3
4
5
6
7
8
9
10
11
12var Person = db.define('person', {
name : String
});
Person.hasMany("friends", {
rate : Number
}, {
key : true, // Turns the foreign keys in the join table into a composite key
autoFetch : true
});
var John = Person.getSync(123);
// no need to do John.getFriends() , John already has John.friends Array
U kunt deze optie ook globaal definiëren in plaats van per associatie.
1
2
3
4
5
6
7
8
9
10var Person = db.define('person', {
name : String
}, {
autoFetch : true
});
Person.hasMany("friends", {
rate : Number
}, {
key: true
});
Associaties kunnen het gekoppelde model aanroepen met behulp van deze reverse
optie. Als u bijvoorbeeld een koppeling heeft van ModelA naar ModelB, kunt u een accessor in ModelB maken om instanties van ModelA op te halen. Verwarrend? Kijk eens naar het volgende voorbeeld.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16var Pet = db.define('pet', {
name : String
});
var Person = db.define('person', {
name : String
});
Pet.hasOne("owner", Person, {
reverse : "pets"
});
var pets = Person(4).getPetsSync();
// although the association was made on Pet,
// Person will have an accessor (getPets)
//
// In this example, ORM will fetch all pets
// whose owner_id = 4
Dit is zelfs nog logischer als je hasMany
associaties hebt, omdat je de vele tot vele
associaties van beide kanten kunt beheren.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15var Pet = db.define('pet', {
name : String
});
var Person = db.define('person', {
name : String
});
Person.hasMany("pets", Pet, {
bought : Date
}, {
key : true,
reverse : "owners"
});
Person(1).getPetsSync(...);
Pet(2).getOwnersSync(...);
Transactieondersteuning
U kunt de transactiefunctie op laag niveau gebruiken om db-transcatie te verwerken.
1
2
3
4
5
6db.begin();
...
if(err)
db.rollback();
else
db.commit();
Of u kunt trans gebruiken om het eenvoudig te verwerken.
1
2
3
4var result = db.trans(() => {
...
return result;
});
Externe databaseadapters toevoegen
Om een externe databaseadapter toe te voegen aan orm
, roept u de addAdapter
methode aan, waarbij u de alias doorgeeft die u wilt gebruiken om verbinding te maken met deze adapter, samen met de constructor voor de adapter:
1require('orm').addAdapter('cassandra', CassandraAdapter);
Zienthe documentation for creating adaptersvoor meer details.