Kmom05: ORM / Databas

By . Latest revision .

När databasdrivna applikationer byggs i ramverk finns olika taktiker för att integrera applikationskoden med databasen. Ett sätt är att jobba mot ett databas API som är uppbyggt av lagrade procedurer (jämför med databas-kursen). Ett annat sätt, som är vanligt i de ramverk vi har studerat, är att använda sig av ett ORM lager (Object Relational Mapping), vars syfte är att objektifiera relationsdatabasen och accessen till databasen. Det handlar alltså om att göra relationsdatabasen mer objektorienterad.

Själva grundtanken med ORM-moduler är att ge programmeraren möjlighet att jobba mot databasen med vanlig objektorienterad PHP kod via metoder, klasser och objekt. Det gränssnitt som ORM erbjuder döljer själva databasen och programmeraren behöver inte vara speciellt bevandrad i varken SQL eller hur en relationsdatabas fungerar.

Relationsmodellen och den objektorienterade modellen är två olika modeller och de har olika sätt att strukturera upp sitt innehåll. I relationsmodellen pratar vi om tabeller, kolumner och rader samt kopplingar mellan tabeller. När databasen döljs bakom ett ORM så erbjuds ett komplett objektorienterat synsätt mot databasens innehåll, fritt från SQL.

Du skall nu läsa på om ORM och välja ett ORM att jobba med samt koppla din applikation, via ett ORM, till en databas.

Detta är instruktionen för kursmomentet och omfattar cirka 20 studietimmar. Fokus ligger på uppgifter som du skall lösa och redovisa. För att lösa uppgifterna behöver du normalt jobba igenom övningar och läsanvisningar för att skaffa dig rätt kunskap och förståelse av uppgiftens alla delar. Läs igenom hela kursmomentet innan du börjar jobba.

#Labbmiljö

(ca: 1-2 studietimmar)

Du kan använda databaserna MySQL, MariaDB eller SQLite för att genomföra uppgiften. När du publicerar din applikation till studentservern så skall applikationen fungera med sin databaskoppling.

  1. Väljer du MySQL/MariaDB så kan du använda BTHs databasserver för studenter enligt följande.

  2. Väljer du SQLite så bör du vara bekant med den databasen sedan tidigare och du vet hur den kan publiceras till studentservern (htmlphp-kursen).

En rekommendation är att i övningarna nedan börja jobba med SQLite och när man är bekväm med att det fungerar så kan man byta över till MySQL/MariaDB då de databaserna kräver lite mer administration och hantering för att komma igång.

#Uppgifter & Övningar

(ca: 10-14 studietimmar)

Uppgifter skall utföras och redovisas, övningar är träning inför uppgifterna.

#Uppgifter

Följande uppgifter skall utföras och resultatet skall redovisas.

  1. Lös uppgiften “Kom igång med ett ORM i ditt PHP-ramverk”.

#Övningar

Följande övningar kan förbereda dig inför uppgiften.

  1. I kursrepot under example/orm ligger exempelkod som visar hur du kommer igång med olika ORM och ramverk. Jobba igenom valda exempel, när du har valt vilket ORM/ramverk du tänker jobba med eller testa ett par olika för att utvärdera.

#Läs & Studera

(ca: 2-8 studietimmar)

#Föreläsning

Titta igenom följande föreläsningar.

#Database ORM - Object Relational Mapping

Som en del i en Zoom-session hölls en föreläsning om “Database ORM - Object Relational Mapping” och det ger en bra introduktion till vad detta kmom handlar om.

Slides till föreläsningen “Database ORM - Object Relational Mapping”.

Database ORM - Object Relational Mapping (med Mikael).

Som ett komplement till föreläsningen hittar du referenser längre ned i detta dokumentet under “PHP, data abstraktion och ORM”.

#Litteratur

Läsanvisningar finns generellt för begreppet ORM och de är samlade längst ned i detta dokumentet under rubriken “Resurser bra-att-ha”.

Läsanvisningarna berör olika ramverk och deras implementationer av ORM.

Läsanvisningarna berör implementationer av fristående ORM som kan användas oberoende av ramverk.

#Resultat & Redovisning

(ca: 1-2 studietimmar)

Läs instruktionen om hur du skall redovisa. Observera att denna kursen skiljer sig från hur du normalt sett lämnar in din redovisningstext.

Se till att följande frågor besvaras i texten i din rapport:

  • Berätta hur du tog dig an uppgiften och valde ditt ORM och den kodbas du valde att bygga uppgiften på, vad lät du styra dina val, vad valde du och vad gjorde att du slutligen valde det du gjorde?

  • När du kom in i ORM-modulerna och började installerade det, hur gick det? Var dokumentationen stöttande och kändes terminologin bekant sedan tidigare?

  • Berätta om din applikation, hur den använder databasen och hur du implementerade applikationen, dels med vilken databas och dels med vilka tekniker/lager i ditt valda ORM. Fanns det svårigheter och utmaningar i arbetet?

  • Vad är din uppfattning om ORM så här långt och relatera gärna till andra sätt att jobba med applikationskod mot databaser?

  • Vilken är din TIL för detta kmom?

#Resurser bra-att-ha

Här anges övriga resurser som kan användas för vidare studier i det som kursmomentet omfattar.

#PHP, data abstraktion och ORM

Detta stycke ger dig en generell introduktion till begreppet ORM och vad som ligger bakom hur det implementeras.

I PHP erbjuder PHP PDO ett data access lager (DAL) som är lika oavsett databas. De metoder man använder för att koppla sig mot databasen och ställa frågor är lika oavsett vilken databas som används. Man har “unifierat” gränssnittet mot olika databaser.

PDO erbjuder inte ett database access lager (DBAL) som ger möjligheten att skriva samma SQL-frågor, oavsett databas. Ett DBAL interface är databas agnostiskt och kommunicerar på exakt samma sätt, oavsett vilken databas som ligger bakom. Ett sådant gränssnitt översätter normalt SQL-frågorna så att de blir lika och fungerar oavsett underliggande databas men det är inget som applikationsprogrammeraren behöver bry sig om.

Ett lager av ORM kan bygga vidare på ett lager DBAL och låter dig behandla relationsdatabasens innehåll som objekt. Några av de vanligaste designmönster som är implementerade i ett ORM är Active record och Repository, andra varianter som kan förekomma är bland annat Table Data Gateway, Row Data Gateway samt Data Mapper. Implementationerna skiljer mellan olika leverantörer av ORM.

Läsresurser.

Wikipieda.

Designmönster för data access och object-to-relational mapping.

#Doctrine ORM

Resurser för Doctrine ORM.

#ReadBeanPHP ORM

Resurser för ReadBeanPHP ORM.

#Propel ORM

Resurser för Propel ORM.

#Symfony

Resurser för Symfony.

#Laravel

Resurser för Laravel.

#Yii framework

Resurser för Yii framework.

#Laminas

Resurser för Laminas.

#Revision history

  • 2021-04-30: (B, mos) Lade till ORM föreläsning från Zoom och övningar.
  • 2021-04-26: (A, mos) Första utgåvan.

Document source.