2013-05-09 4 views
4

내가 MySQL의 워크 벤치에 내 데이터베이스를 설계하고 내 모든 외래 키 설정을했습니다, 등 나는이 DB를 사용 꿔자동 생성 모델 클래스

스키마를 Laravel 4와 함께 사용하지만 문서에서 기존 데이터베이스 테이블 세트로 작업 할 수있는 능력은 없습니다. 내 이해에서 Cake와 같은 다른 프레임 워크 인 'Baking'을 사용하면 데이터베이스에 이미 존재하는 테이블을 기반으로 모델 클래스를 자동으로 생성 할 수 있습니다.

저는 Laravel 4에서이 모든 것을 전혀 볼 수 없었습니다. 제가 발견 한 가장 가까운 것은 제프리 웨이의 장인 용 Generator 패키지입니다. 그러나 이것은 기본 모델 만 생성하고 감지하지 못합니다 설립 된 외래 키 관계.

Laravel 4에서도이 작업을 수행 할 수 있습니까? 아니면 수동으로 수행해야합니까?

답변

11

좋은 소식은 안토니오 그냥이 아름다운 솔루션입니다하지만 나를 위해 늦은 방법을 제공하지만 당신에게 많은 도움이 될 수 있습니다 자신의 MySQL WorkBench to Eloquent ORM converter 을 완료한다는 것입니다.

업데이트 : 링크가 작동하지 않습니다. wabpage는 "우리는 일을 다시 디자인하고 있으며 곧 돌아올 것입니다!"라고 말합니다. 나는이 서비스가 다시 이용 가능해질 때까지 안토니오에게 요청하는 이메일을 이미 보냈다.

안토니오는 돌아올 것이라고했지만 예상 도착 시간은 없습니다. 우리는 기다려야 만합니다 ...

+0

매력처럼 작동합니다 - 훌륭한 도구. 대단히 감사합니다! – Sk446

+1

당신은 환영합니다;) Antonio는 심지어 다음 버전이 씨앗을 생성하여 데이터를 가져올 수 있다고 약속했습니다. – Hexodus

+1

안녕하세요 @Hexodus, 게시 해 주셔서 감사합니다. 나는 현재 가장 일반적인 기능 (InnoDB/MyIsam 테이블 사용, 소프트 삭제 구현, 주석 레벨 지시문 등)을 요청하고있다.2 개월 내에 업데이트 및 전체 사이트 점검을 기대하십시오. –

1

cakePHP는 이미 완료된 DB 스키마에서 전체 프로젝트를 수행하는 데 훌륭한 역할을합니다. Laravel은 현재 이와 같은 것을 지원하지 않습니다. 사소한 기능 중 하나는 laravel을 채택하지 못하게합니다.

+1

네이티브 마이그레이션 데이터 및 DB 스키마는 실제로 큰 플러스입니다. – 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; 
    } 
} 

내보기 템플릿 (꽤 많이 내 클래스 템플릿)

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

이것은 내가 필요한 방식으로 자동 생성 된 기본 클래스를 얻을 수있는 적절한 방법을 제공합니다. db 사용자와 함께 information_schema 스키마를 볼 수 있어야한다는 것을 기억하십시오.

희망이 있습니다.