首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Laravel4自动生成模型类(也称为使用现有数据库和L4)

问使用Laravel4自动生成模型类(也称为使用现有数据库和L4)
EN

Stack Overflow用户
提问于 2013-05-10 04:36:08
回答 3查看 4.4K关注 0票数 4

我已经在MySQL工作台中设计了我的数据库,并设置了我所有的外键等。

我想在Laravel 4中使用这个DB模式,但是在文档中没有提到能够处理现有的一组数据库表。据我所知,其他框架,如Cake和它的“烘焙”,允许您自动生成基于数据库中已有的表的模型类。

我到处看了看,在Laravel 4中根本看不到这方面的任何东西。我找到的最接近的是Jeffrey Way的artisan生成器包,但是这只创建了基本模型,并没有检测到已建立的外键关系。

使用Laravel 4可以做到这一点吗?或者我必须手动完成所有这些工作?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-10 05:22:08

好消息是,安东尼奥刚刚完成了他的,这是一个很好的解决方案,但对我来说有点晚了,但可能会对你有很大帮助。

更新:链接暂时不起作用。wabpage上写着“我们正在重新设计东西,很快就会回来!”我已经给antonio发了一封电子邮件,问他什么时候可以再次使用这项服务。

安东尼奥说它会回来的,但目前还没有估计的到达时间。我们必须等待..。

票数 11
EN

Stack Overflow用户

发布于 2013-05-10 04:51:40

cakePHP在从已经存在的DB模式中充实整个项目方面做得很好。Laravel目前不支持这样的东西。其中一个小特性仍然阻碍着我采用laravel。

票数 1
EN

Stack Overflow用户

发布于 2014-07-29 12:11:07

嗯,我有同样的问题,我自己写了一个小脚本,它生成基类并解决外键问题。这是一个基本的解决方案,并且只确定"hasOne“关系,稍后您可能必须将其更改为hasMany。我使用了一个控制器,并在视图中构建了我的代码模板:

控制器:

代码语言:javascript
复制
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;
    }
}

类我的视图模板(几乎就是我的类模板)

代码语言:javascript
复制
<?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;?>

}

然后,只需为其提供文件夹:(从您喜欢的任何位置)来生成您的基类。

代码语言:javascript
复制
$controller = new \Admin\ModelController();
$controller->create(__DIR__ . DIRECTORY_SEPARATOR . 'tmpModel');

这给了我一些很好的方法来让我的基类自动生成我需要的方式。请记住,您必须能够与db用户一起查看information_schema模式。

希望这能有所帮助

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16470645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档