将Laravel模型名称空间附加为表前缀

时间:2017-12-15 15:02:40

标签: php laravel model artisan

我正在开发一个包含多个"应用程序":文章,笔记,照片等的Laravel 5.5项目。

每个应用程序都应该有自己的目录/命名空间,包含其模型:

app/
    Blog/
        Article.php
        Category.php
    Notes/
        Note.php
        Category.php
    ...

当我运行此命令php artisan make:model --migration Blog/Category时,它成功创建了app/Blog/Category.php模型和App\Blog命名空间,但关联的迁移创建了一个名为category的表,而不是{{ 1}}。这是有问题的,因为我还需要创建blog_category

是否有一个前缀app/Notes/Category.php表的技巧?如果我手动更改名称,Laravel会解析这些表格,还是我必须在每个模型中添加category属性?

令人惊讶的是,模型命名空间和表名与Laravel逻辑之后的前缀无关?

3 个答案:

答案 0 :(得分:2)

解决它有两种选择:

  • 使用BlogArticle创建模型,该模型将创建blog_articles表
  • 或者将$table="your table name"添加到每个模型

答案 1 :(得分:0)

这个特性可以帮到你

use Illuminate\Support\Str;

trait TableNameResolver
{
    public $base_namespace=__NAMESPACE__;

    public function getTable()
    {
        if (! isset($this->table)) {
           $this->setTable(str_replace(
                '\\', '', Str::snake(Str::plural(trim(str_after(get_class($this),trim($this->base_namespace,'\\')),'\\')))
            ));
        }
        return $this->table;
    }
}

答案 2 :(得分:0)

遵循the_hasanov的答案:

我做了一些改动,效果很好。

namespace App\Traits;

use Illuminate\Support\Str;

trait ModelTrait
{

    /**
     * Scopped Variables
     */
    protected $table_prefix              =  "prefix_";

    /**
     * Appends prefix to table name
     * 
     * @return $table
     */
    public function getTable() {

        $model                           =  explode("\\", get_class($this));
        $model                           =  Str::lower(array_pop($model));

        if (!isset($this->table)) $this->setTable(Str::plural($this->table_prefix . $model));

        return $this->table;

    }

}

添加这样的特征,并在模型中使用它,如下所示:

class Model {
    use ModelTrait;
}