Retrieving Records
Flat record
Using the following table articles:
| id | title |
|---|---|
| 1 | Sweet Baby Ray's is the best! |
| 2 | PB&J is yummy |
| 3 | I like Jellyfish |
First model the table:
namespace Application\Model;
class Article {
public $id,$title;
}
Then in the config:
'auto_tables' => [
'articles' => [
'table_name' => 'articles',
'entity' => \Application\Model\Article::class,
'hydrator' => \Zend\Hydrator\ObjectProperty::class,
]
]
And finally, simple use it:
// $serviceLocator is an instance of the main ServiceManager
$manager = $serviceLocator->get(\AutoTable\AutoTableManager::class);
$table = $manager->get('articles');
$entity = $table->fetchWithId(2);
// Outputs: "PB&J is yummy"
echo $entity->title;
One-to-One relationships
With a table articles:
| id | title | author |
|---|---|---|
| 1 | Sweet Baby Ray's is the best! | 1 |
| 2 | PB&J is yummy | 1 |
| 3 | I like Jellyfish | 2 |
and another table authors:
| id | name |
|---|---|
| 1 | Nathan Smith |
| 2 | Fake Name |
Start by modeling the entity for both:
The article:
namespace Application\Model;
class Article {
public $id,$title,$author;
}
and the author
namespace Application\Model;
class Author {
public $id,$name;
}
Then in the config, define both the articles and authors table and use the linked_tables key to configure the relationship:
'auto_tables' => [
'articles' => [
'table_name' => 'articles',
'entity' => \Application\Model\Article::class,
'hydrator' => \Zend\Hydrator\ObjectProperty::class,
'linked_tables' => [
'author' => [
'name' => 'authors',
'type' => 'one_to_one',
]
]
],
'authors' => [
'table_name' => 'authors',
'entity' => \Application\Model\Author::class,
'hydrator' => \Zend\Hydrator\ObjectProperty::class,
]
]
Then use it:
// $serviceLocator is an instance of the main ServiceManager
$manager = $serviceLocator->get(\AutoTable\AutoTableManager::class);
$table = $manager->get('articles');
$article = $table->fetchWithId(3);
// Outputs: "I like Jellyfish"
echo $article->title;
// Outputs: "Fake Name"
echo $article->author->name;
One-to-Many relationships
With a table articles:
| id | title |
|---|---|
| 1 | Sweet Baby Ray's is the best! |
| 2 | PB&J is yummy |
| 3 | I like Jellyfish |
and another table comments:
| id | comment | article_id |
|---|---|---|
| 1 | This is the best article ever! | 1 |
| 2 | I hated this! | 1 |
| 3 | I am a lost prince and I have money. | 2 |
Start by modeling the entity for both:
The article:
namespace Application\Model;
class Article {
public $id,$title;
}
and the author
namespace Application\Model;
class Comment {
public $id,$comment;
}
Then in the config, define both the articles and comments table and use the linked_tables key to configure the relationship:
'auto_tables' => [
'articles' => [
'table_name' => 'articles',
'entity' => \Application\Model\Article::class,
'hydrator' => \Zend\Hydrator\ObjectProperty::class,
'linked_tables' => [
'author' => [
'name' => 'authors',
'type' => 'one_to_many',
'remote_column' => 'arcticle_id',
'local_column' => 'id',
]
]
],
'comments' => [
'table_name' => 'comments',
'entity' => \Application\Model\Comment::class,
'hydrator' => \Zend\Hydrator\ObjectProperty::class,
]
]
Then use it:
// $serviceLocator is an instance of the main ServiceManager
$manager = $serviceLocator->get(\AutoTable\AutoTableManager::class);
$table = $manager->get('articles');
$article = $table->fetchWithId(1);
// Outputs: "Sweet Baby Ray's is the best!"
echo $article->title;
// Outputs: "This is the best article ever!" and "I hated this!"
foreach($article->comments as $comment) {
echo $comment->comment;
}
Many-to-many relationships
With a table articles:
| id | title |
|---|---|
| 1 | Sweet Baby Ray's is the best! |
| 2 | PB&J is yummy |
| 3 | I like Jellyfish |
and another table authors:
| id | Name |
|---|---|
| 1 | Nathan Smith |
| 2 | Fake Name |
| 3 | Jimmy Boi |
| 4 | John Doe |
and a mapping table articles_authors_map:
| article_id | author_id |
|---|---|
| 1 | 1 |
| 1 | 3 |
| 2 | 3 |
| 3 | 4 |
| 3 | 2 |
Start by modeling the entity for both:
The article:
namespace Application\Model;
class Article {
public $id,$title,$authors;
}
and the author
namespace Application\Model;
class Author {
public $id,$name,$articles;
}
Then in the config, define both the articles , authors, and articles_authors_map tables and use the linked_tables key for the articles and authors table to configure the two-way relationship:
'auto_tables' => [
'articles' => [
'table_name' => 'articles',
'entity' => \Application\Model\Article::class,
'hydrator' => \Zend\Hydrator\ObjectProperty::class,
'linked_tables' => [
'authors' => [
'type' => 'many_to_many',
'remote_table' => 'authors',
'mapping_table' => 'articles_authors_map',
'local_column' => 'id',
'local_property' => 'id',
'local_mapping_column' => 'article_id',
'remote_mapping_column' => 'author_id',
'remote_column' => 'id',
]
]
],
'authors' => [
'table_name' => 'authors',
'entity' => \Application\Model\Author::class,
'hydrator' => \Zend\Hydrator\ObjectProperty::class,
'linked_tables' => [
'articles' => [
'type' => 'many_to_many',
'remote_table' => 'authors',
'mapping_table' => 'articles_authors_map',
'local_column' => 'id',
'local_property' => 'id',
'local_mapping_column' => 'author_id',
'remote_mapping_column' => 'article_id',
'remote_column' => 'id',
]
]
],
'articles_authors_map' => [
'table_name' => 'articles_authors_map',
]
]
Then use it:
// $serviceLocator is an instance of the main ServiceManager
$manager = $serviceLocator->get(\AutoTable\AutoTableManager::class);
$table = $manager->get('articles');
$article = $table->fetchWithId(3);
// Outputs: "I like Jellyfish"
echo $article->title;
// Outputs: "John Doe" and "Fake Name"
foreach($article->authors as $author) {
echo $author->name;
}
$table = $manager->get('authors');
$author = $table->fetchWithId(3);
// Outputs: "Jimmy Boi"
echo $author->name;
// Outputs: "Sweet Baby Ray's is the best!" and "PB&J is yummy"
foreach($author->articles as $article) {
echo $article->title;
}
Relationships aren't one level deep
Any linked tabled contain all the defined relationships all the time
With a table articles:
| id | title | author |
|---|---|---|
| 1 | Sweet Baby Ray's is the best! | 1 |
| 2 | PB&J is yummy | 1 |
| 3 | I like Jellyfish | 2 |
and another table authors:
| id | Name | Car |
|---|---|---|
| 1 | Nathan Smith | 2 |
| 2 | Fake Name | 1 |
and another table cars:
| id | name |
|---|---|
| 1 | Honda Civic |
| 2 | Tesla Model 3 |
Start by modeling the entity for all:
The article:
namespace Application\Model;
class Article {
public $id,$title,$author;
}
and the author
namespace Application\Model;
class Author {
public $id,$name,$car;
}
and the car
namespace Application\Model;
class Car {
public $id,$name,$car;
}
Then in the config, define the articles, authors, and cars tables and use the linked_tables key to configure the relationships:
'auto_tables' => [
'articles' => [
'table_name' => 'articles',
'entity' => \Application\Model\Article::class,
'hydrator' => \Zend\Hydrator\ObjectProperty::class,
'linked_tables' => [
'author' => [
'name' => 'authors',
'type' => 'one_to_one',
]
]
],
'authors' => [
'table_name' => 'authors',
'entity' => \Application\Model\Author::class,
'hydrator' => \Zend\Hydrator\ObjectProperty::class,
'linked_tables' => [
'car' => [
'name' => 'cars',
'type' => 'one_to_one',
]
]
],
'cars' => [
'table_name' => 'cars',
'entity' => \Application\Model\Car::class,
'hydrator' => \Zend\Hydrator\ObjectProperty::class,
]
]
Then use it:
// $serviceLocator is an instance of the main ServiceManager
$manager = $serviceLocator->get(\AutoTable\AutoTableManager::class);
$table = $manager->get('articles');
$article = $table->fetchWithId(3);
// Outputs: "I like Jellyfish"
echo $article->title;
// Outputs: "Fake Name"
echo $article->author->name;
// Outputs: "Honda Civic"
echo $article->author->car->name;