2013-05-09 3 views
4

Я разработал свою базу данных в MySQL Workbench, и есть все заграничные установки ключей и т.д.модель классов AutoGenerate с Laravel 4 (он же, используя существующую базу данных с L4)

Я хотел использовать эту БД схема с Laravel 4, однако из документов нет никаких слов о любой способности работать с существующим набором таблиц базы данных. С моей точки зрения, другие структуры, такие как Cake с его «выпечкой», позволяют автоматически создавать классы моделей на основе таблиц, уже имеющихся в вашей базе данных.

Я огляделся повсюду и не вижу ничего подобного для Laravel 4. Самое близкое, что я нашел, это комплект генератора Джеффри Пути для ремесленника, однако это только создает базовую модель и не обнаруживает установление отношений с иностранными партнерами.

Возможно ли это с помощью Laravel 4 или мне просто нужно сделать все это вручную?

ответ

11

Хорошая новость заключается в том, что Антонио только что закончил MySQL WorkBench to Eloquent ORM converter Это красивое решение, но приходит способ поздно для меня, но может помочь вам много.

Обновление: Ссылка не работает в данный момент. В wabpage говорится: «Мы переделываем вещи, скоро вернемся!». Я уже отправил Антонио по электронной почте, спрашивая его, когда эта услуга будет доступна снова.

Антонио сказал, что он вернется, но нет приблизительного времени прибытия. Нам нужно подождать ..

+0

Работает как очарование - отличный инструмент. Бесконечно благодарен! – Sk446

+1

Добро пожаловать;) Антонио даже пообещал, что следующая версия сможет импортировать данные с помощью генерации семян. – Hexodus

+1

Эй, @Hexodus, спасибо, что опубликовали это. В настоящее время я работаю над наиболее распространенной функцией (например, используйте таблицы InnoDB/MyIsam, реализации Soft Deletes, директивы на уровне комментариев и т. Д.).Ожидайте обновление и полный ремонт сайта через пару месяцев. –

1

cakePHP отлично справляется с выделением всего проекта из схемы DB уже на месте. В настоящее время Laravel не поддерживает ничего подобного. Одна из второстепенных функций все еще удерживает меня от принятия laravel.

+1

Первичные миграционные данные и схема БД были бы действительно большим плюсом. – Hexodus

1

Хм, у меня была такая же проблема, и я написал сам маленький скрипт, который генерирует базовые классы и решает проблемы внешнего ключа. Это базовое решение и определяет отношения «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; 
    } 
} 

Мой вид шаблона (в значительной степени мой класс Template)

<?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'); 

Это дало мне достойный способ получить мои базовые классы. Автогенерировалось так, как мне было нужно. Помните, что вам нужно увидеть схему information_schema с вашим пользователем db.

Надеюсь, это поможет