data mappers abstract maken: gaat dit wel?
Ik heb onderstaande code:
Code (php)
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
49
50
51
52
53
54
55
56
57
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
49
50
51
52
53
54
55
56
57
<?php
namespace Whear\User;
class UserMapper extends \Whear\Mapper\MapperAbstract
{
public function find($id)
{
$query = $this->getDatabase()->prepare('SELECT * FROM User WHERE id = :id');
$query->bindParam(':id', $id);
$query->execute();
if ($query->rowCount() == 0)
{
return null;
}
else
{
$data = $query->fetch();
$newData = array();
foreach($data as $property => $value)
{
if(!is_int($property))
{
$newData[$property] = $value;
}
}
return new \Whear\User\User($newData);
}
}
public function delete(\Whear\User\User $user)
{
$query = $this->getDatabase()->prepare('DELETE FROM User WHERE id = :id');
$query->bindParam(':id', $user->getId());
$query->execute();
}
public function save(\Whear\User\User $object)
{
foreach($object->getData() as $property => $value)
{
$query = $this->getDatabase()->prepare('UPDATE User SET ' . $property . ' = :value WHERE id = :id');
$query->bindParam(':value', $value);
$query->bindParam(':id', $object->getId());
$query->execute();
}
}
}
?>
namespace Whear\User;
class UserMapper extends \Whear\Mapper\MapperAbstract
{
public function find($id)
{
$query = $this->getDatabase()->prepare('SELECT * FROM User WHERE id = :id');
$query->bindParam(':id', $id);
$query->execute();
if ($query->rowCount() == 0)
{
return null;
}
else
{
$data = $query->fetch();
$newData = array();
foreach($data as $property => $value)
{
if(!is_int($property))
{
$newData[$property] = $value;
}
}
return new \Whear\User\User($newData);
}
}
public function delete(\Whear\User\User $user)
{
$query = $this->getDatabase()->prepare('DELETE FROM User WHERE id = :id');
$query->bindParam(':id', $user->getId());
$query->execute();
}
public function save(\Whear\User\User $object)
{
foreach($object->getData() as $property => $value)
{
$query = $this->getDatabase()->prepare('UPDATE User SET ' . $property . ' = :value WHERE id = :id');
$query->bindParam(':value', $value);
$query->bindParam(':id', $object->getId());
$query->execute();
}
}
}
?>
Code (php)
Zoals je ziet is dit een hele hoop code, en alle methods zoals bijvoorbeeld save() zou ik graag in die abstract method steken. Maar nu kom ik uit op een probleem.
Hoe kies ik dan bijvoorbeeld de juiste tabel als ik iets wil updaten?
En dit:
Hoe maak ik zoiets dynamisch als het in een abstract method staat?
Alvast bedankt.
dit topic. Wouter legt hier mooi aan mij uit hoe je best met de mappers kunt werken.
Het voordeel van het systeem dat hij daar uitlegt is dat je makkelijk van database kunt switchen. Ik denk dat dat ik jouw geval niet lukt nu. Zeker eens bekijken!
Hoi misschien kan je eens zien naar Het voordeel van het systeem dat hij daar uitlegt is dat je makkelijk van database kunt switchen. Ik denk dat dat ik jouw geval niet lukt nu. Zeker eens bekijken!
Hey Jasper, ik had je topic al gezien maar het probleem is niet zo zeer dat ik zomaar van database kan switchen, meer hoe ik alles in één abstract class laat en dynamisch een User bijvoorbeeld laden (dus dat de abstract method niet alleen User kan inladen, maar bv. ook Message als dat moet, dynamisch.)
Kan je dat niet doen met de storage klassen uit mijn voorbeeld?
Wat ik je kan aan raden is een populate method te maken de een array met data uit de database omzet in een object.