4

MySQL Workbench でデータベースを設計し、すべての外部キーをセットアップしました。

このDBスキーマをLaravel 4で使用したいのですが、ドキュメントから、既存のデータベーステーブルのセットを操作する能力についての言葉はありません。私の理解では、'Baking' を備えた Cake などの他のフレームワークを使用すると、データベースに既に存在するテーブルに基づいてモデル クラスを自動的に生成できます。

私はいたるところを見回しましたが、Laravel 4ではこれについてまったく何も見ることができません.私が見つけた最も近いものは職人のためのジェフリーウェイのジェネレーターパッケージですが、これは基本モデルを作成するだけで、確立された外部キー関係を検出しません.

これはLaravel 4でも可能ですか、それともすべて手動で行う必要がありますか?

4

3 に答える 3

11

良いニュースは、Antonio がMySQL WorkBench から Eloquent ORM へ のコンバーターを完成させたところです。

更新: 現在、リンクは機能していません。wabpage には、「私たちは物事を再設計しています。すぐに戻ってきます!」と書かれています。このサービスが再び利用可能になる時期について、私はすでにアントニオに電子メールを送信しました。

アントニオは戻ってくると言っていましたが、到着予定時刻はありません. 私たちは待たなければなりません..

于 2013-05-09T21:22:08.203 に答える
1

うーん、同じ問題があり、基本クラスを生成して外部キーの問題を解決する小さなスクリプトを自分で書きました。これは基本的な解決策であり、後で hasMany に変更する必要があるかもしれない "hasOne" 関係のみを決定します。コントローラーを使用して、ビューでコード テンプレートを作成しました。

コントローラ:

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 スキーマを表示できる必要があることを思い出してください。

お役に立てれば

于 2014-07-29T04:11:07.083 に答える
1

CakePHP は、既に配置されている DB スキーマからプロジェクト全体を具体化するのに優れた仕事をします。Laravel は現在、このようなものをサポートしていません。まだlaravelの採用を妨げているマイナーな機能の1つです。

于 2013-05-09T20:51:39.620 に答える