mirror of
https://github.com/fzaninotto/Faker.git
synced 2025-04-12 03:21:57 +02:00
Simplify ORM populator
This commit is contained in:
parent
3e6def385c
commit
844c782436
60
src/Faker/Guesser/Name.php
Normal file
60
src/Faker/Guesser/Name.php
Normal file
@ -0,0 +1,60 @@
|
||||
<?php
|
||||
|
||||
namespace Faker\Guesser;
|
||||
|
||||
class Name
|
||||
{
|
||||
protected $generator;
|
||||
|
||||
public function __construct(\Faker\Generator $generator)
|
||||
{
|
||||
$this->generator = $generator;
|
||||
}
|
||||
|
||||
public function guessFormat($name)
|
||||
{
|
||||
$name = strtolower($name);
|
||||
$generator = $this->generator;
|
||||
if (preg_match('/^is[_A-Z]/', $name)) {
|
||||
return function() use ($generator) { return $generator->boolean; };
|
||||
}
|
||||
if (preg_match('/(_a|A)t$/', $name)) {
|
||||
return function() use ($generator) { return $generator->dateTime; };
|
||||
}
|
||||
switch ($name) {
|
||||
case 'first_name':
|
||||
case 'firstname':
|
||||
return function() use ($generator) { return $generator->firstName; };
|
||||
case 'last_name':
|
||||
case 'lastname':
|
||||
return function() use ($generator) { return $generator->lastName; };
|
||||
case 'username':
|
||||
case 'login':
|
||||
return function() use ($generator) { return $generator->userName; };
|
||||
case 'email':
|
||||
return function() use ($generator) { return $generator->email; };
|
||||
case 'phone_number':
|
||||
case 'phonenumber':
|
||||
case 'phone':
|
||||
return function() use ($generator) { return $generator->phoneNumber; };
|
||||
case 'address':
|
||||
return function() use ($generator) { return $generator->address; };
|
||||
case 'city':
|
||||
return function() use ($generator) { return $generator->city; };
|
||||
case 'streetaddress':
|
||||
return function() use ($generator) { return $generator->streetAddress; };
|
||||
case 'postcode':
|
||||
case 'zipcode':
|
||||
return function() use ($generator) { return $generator->postcode; };
|
||||
case 'state':
|
||||
return function() use ($generator) { return $generator->state; };
|
||||
case 'country':
|
||||
return function() use ($generator) { return $generator->country; };
|
||||
case 'title':
|
||||
return function() use ($generator) { return $generator->sentence; };
|
||||
case 'body':
|
||||
case 'summary':
|
||||
return function() use ($generator) { return $generator->text; };
|
||||
}
|
||||
}
|
||||
}
|
@ -2,11 +2,25 @@
|
||||
|
||||
namespace Faker\ORM;
|
||||
|
||||
include __DIR__ . '/../Guesser/Name.php';
|
||||
|
||||
class Propel
|
||||
{
|
||||
protected $class;
|
||||
protected $columnFormatters = array();
|
||||
|
||||
public static function populateClasses($generator, $classes)
|
||||
{
|
||||
$entities = array();
|
||||
foreach ($classes as $class => $number) {
|
||||
$populator = new self($class);
|
||||
$populator->setColumnFormatters($populator->guessColumnFormatters($generator));
|
||||
$populator->populate($number, $entities);
|
||||
}
|
||||
|
||||
return $entities;
|
||||
}
|
||||
|
||||
public function __construct($class)
|
||||
{
|
||||
$this->class = $class;
|
||||
@ -17,6 +31,31 @@ class Propel
|
||||
$this->columnFormatters = array_merge($columnFormatters, $this->columnFormatters);
|
||||
}
|
||||
|
||||
public function guessColumnFormatters(\Faker\Generator $generator)
|
||||
{
|
||||
$formatters = array();
|
||||
$class = $this->class;
|
||||
$peerClass = $class::PEER;
|
||||
$tableMap = $peerClass::getTableMap();
|
||||
$nameGuesser = new \Faker\Guesser\Name($generator);
|
||||
foreach ($tableMap->getColumns() as $columnMap) {
|
||||
if ($columnMap->isForeignKey()) {
|
||||
$relatedClass = $columnMap->getRelation()->getForeignTable()->getPhpName();
|
||||
$formatters[$columnMap->getPhpName()] = function($inserted) use($relatedClass) { return isset($inserted[$relatedClass]) ? $inserted[$relatedClass][mt_rand(0, count($inserted[$relatedClass]) - 1)] : null; };
|
||||
continue;
|
||||
}
|
||||
if ($columnMap->isPrimaryKey()) {
|
||||
continue;
|
||||
}
|
||||
if ($formatter = $nameGuesser->guessFormat($columnMap->getPhpName())) {
|
||||
$formatters[$columnMap->getPhpName()] = $formatter;
|
||||
continue;
|
||||
}
|
||||
// TODO: PropelColumnTypeGuesser
|
||||
}
|
||||
return $formatters;
|
||||
}
|
||||
|
||||
public function populate($nb = 100, &$insertedEntities = array())
|
||||
{
|
||||
$pks = array();
|
||||
|
@ -7,21 +7,12 @@ Propel::init(dirname(__FILE__) . '/../../Propel/test/fixtures/bookstore/build/co
|
||||
require_once '../src/Faker/ORM/Propel.php';
|
||||
require_once '../src/Faker/Factory.php';
|
||||
|
||||
$entities = array();
|
||||
$generator = Faker\Factory::create();
|
||||
BookQuery::create()->deleteAll();
|
||||
AuthorQuery::create()->deleteAll();
|
||||
$populator = new Faker\ORM\Propel('Author');
|
||||
$authorColumnFormatters = array(
|
||||
'FirstName' => function() use ($generator) { return $generator->firstName; },
|
||||
'LastName' => function() use ($generator) { return $generator->lastName; }
|
||||
);
|
||||
$populator->setColumnFormatters($authorColumnFormatters);
|
||||
$populator->populate(10, $entities);
|
||||
$bookColumnFormatters = array(
|
||||
'Title' => function() use ($generator) { return $generator->sentence; },
|
||||
'AuthorId' => function($inserted) { return $inserted['Author'][mt_rand(0, count($inserted['Author']) - 1)]; }
|
||||
);
|
||||
$populator = new Faker\ORM\Propel('Book');
|
||||
$populator->setColumnFormatters($bookColumnFormatters);
|
||||
$inserted = $populator->populate(10, $entities);
|
||||
|
||||
$inserted = Faker\ORM\Propel::populateClasses(Faker\Factory::create(), array(
|
||||
'Author' => 5,
|
||||
'Book' => 10
|
||||
));
|
||||
|
||||
echo BookQuery::create()->joinWith('Book.Author')->find();
|
Loading…
x
Reference in New Issue
Block a user