Я разработал свою базу данных в MySQL Workbench и установил все мои внешние ключи и т. Д.
Я хочу использовать эту схему БД с Laravel 4, однако из документов нет слов о любой способности работать с существующим набором таблиц базы данных. С моей точки зрения, другие структуры, такие как Cake с его «выпечкой», позволяют автоматически создавать классы моделей на основе таблиц, уже имеющихся в вашей базе данных.
Я огляделся повсюду и не вижу ничего подобного для Laravel 4. Самое близкое, что я нашел, это комплект генератора Джеффри Пути для ремесленника, однако это только создает базовую модель и не обнаруживает установленных отношений внешнего ключа ,
Возможно ли это с Laravel 4, или мне придется делать все это вручную?
Хорошей новостью является то, что Антонио только что закончил свой MySQL WorkBench в Eloquent ORM converter. Это прекрасное решение, но мне приходит конец, но может вам очень помочь.
Обновление: ссылка не работает в данный момент. В wabpage говорится: «Мы переделываем вещи, скоро вернемся!». Я уже отправил Антонио по электронной почте, спрашивая его, когда эта услуга будет доступна снова.
Антонио сказал, что он вернется, но нет приблизительного времени прибытия. Нам нужно подождать..
cakePHP отлично справляется с разработкой всего проекта из схемы DB уже на месте. В настоящее время Laravel не поддерживает ничего подобного. Одна из второстепенных функций все еще удерживает меня от принятия laravel.
Хм, у меня была такая же проблема, и я написал небольшой скрипт, который генерирует базовые классы и решает проблемы внешнего ключа. Это базовое решение и определяет отношения «hasOne», которые вам, возможно, придется изменить на hasMany позже. Я использовал контроллер и создаю свой шаблон кода в представлении:
контроллер:
namespace Admin; /** * just a quick helper to generate model classes * from mysql to Eloquent style ones.. * @author Mario */ class ModelController extends \BaseController { /** * save Classes in folder of choice * * @return void */ public function create($folder) { $sql = "SELECT * FROM information_schema.tables WHERE table_schema = 'UR_SCHEMA'"; $tables = \DB::select($sql); $sql2 = "select * from information_schema.`KEY_COLUMN_USAGE` where constraint_schema = 'UR_SCHEMA' order by table_name"; $keys = \DB::select($sql2); $meta = $this->sortOutMetadata($keys); foreach ($tables as $table) { $metaData = null; if(!empty($meta[$table->TABLE_NAME])){ $metaData = $meta[$table->TABLE_NAME]; } $code = \View::make('model.start', array('table' => $table, 'meta' => $metaData))->render(); file_put_contents($folder.DIRECTORY_SEPARATOR.ucfirst(camel_case($table->TABLE_NAME).'.php'), $code); } } /** * provide structure indexed by table * * @param type $keys * @return type */ private function sortOutMetadata($keys) { $return = array(); foreach ($keys as $key) { if ($key->CONSTRAINT_NAME == 'PRIMARY') { $return[$key->TABLE_NAME]['pk'] = $key->COLUMN_NAME; } elseif (!empty($key->REFERENCED_TABLE_NAME)) { //one way $return[$key->TABLE_NAME]['fk'][] = array('column' => $key->COLUMN_NAME, 'refColumn' => $key->REFERENCED_COLUMN_NAME, 'refTable' => $key->REFERENCED_TABLE_NAME,); //and the other $return[$key->REFERENCED_TABLE_NAME]['fk'][] = array('column' => $key->REFERENCED_COLUMN_NAME, 'refColumn' => $key->COLUMN_NAME, 'refTable' => $key->TABLE_NAME,); } } return $return; } }
Мой шаблон шаблона (в основном мой шаблон шаблона)
<?php echo '<?php'; ?> namespace Model\Base; use Model\Model; class <?php echo ucfirst(camel_case($table->TABLE_NAME));?> extends Model { /** * @var String */ protected $table = '<?php echo $table->TABLE_NAME;?>'; <?php if (isset($meta['pk'])):?> /** * @var String */ protected $primaryKey = '<?php echo $meta['pk'];?>'; /** * attributes not writable from outside * @var mixed */ protected $guarded = array('<?php echo $meta['pk'];?>'); <?php endif;?> /** * Timestamps we dont want here * @var Boolean */ public $timestamps = false; <?php if (isset($meta['fk'])):?> <?php foreach($meta['fk'] as $keys):?> /** * @return HasOne */ public function <?php echo camel_case($keys['refTable']);?>() { return $this->hasOne('Model\<?php echo ucfirst(camel_case($keys['refTable']));?>', '<?php echo $keys['refColumn'];?>', '<?php echo $keys['column'];?>'); } <?php endforeach;?> <?php endif;?> }
Затем просто создайте базовые классы, предоставив им папку: (откуда бы вы ни выбрали)
$controller = new \Admin\ModelController(); $controller->create(__DIR__ . DIRECTORY_SEPARATOR . 'tmpModel');
Это дало мне неплохой способ получить мои базовые классы Auto, созданные так, как мне было нужно. Помните, что вам нужно увидеть схему information_schema с вашим пользователем db.
Надеюсь это поможет