如何在Laravel中使用php artisan为数据库视图创建迁移?

如何在Laravel中使用php artisan为数据库视图创建迁移?,php,laravel,laravel-5.2,Php,Laravel,Laravel 5.2,实际上,我已经使用PHP Artisan通过下面的步骤为Laravel创建了一个sql视图 第一步。运行以下命令: php artisan make:migration create_overall_report_views 第二步 打开迁移文件并添加以下代码: class CreateOverallReportView extends Migration { /** * Run the migrations. * * @return void */ public f

实际上,我已经使用PHP Artisan通过下面的步骤为Laravel创建了一个sql视图

第一步。运行以下命令:

php artisan make:migration create_overall_report_views
第二步

打开迁移文件并添加以下代码:

class CreateOverallReportView extends Migration 
{
  /**
  * Run the migrations.
  *
  * @return void
  */
  public function up()
  {
    //
    DB::statement("
      CREATE VIEW views_overall_report AS
      (
        SELECT er.user_id as user_id, e.id AS entities_id, 
            c.status_id AS status_id, s.name AS status_name

        FROM `user_roles` er
          LEFT JOIN elists e ON e.id=er.entities_id
          LEFT JOIN `clists` c ON c.id=e.checklists_id
          LEFT JOIN `status` s ON s.id = c.overall_status_id

        WHERE s.slug = 'completed'
          AND c.deleted_at IS NULL
      )
    ");
  }

  /**
  * Reverse the migrations.
  *
  * @return void
  */
  public function down()
  {
    DB::statement('DROP VIEW IF EXISTS views_overall_report');
  }  

}
第三步。通过Laravel查询调用和运行SQL视图

$items = $DB::table('views_overall_report')
            ->select('status_id', 'status_name',
                $DB::raw('count(entities_id) as counts')
            )
            ->groupBy('status_id')
            ->orderBy('counts' , 'desc')
            ->whereIn('user_id', Auth::user()->id())
            ->get();
print_r($items);

希望有帮助。如果有更好的解决方案,请告诉我

您必须使用laravel雄辩地在您的模型中创建两者之间的关系。 例如: 如果您有两个表(角色、用户),并且它们之间的关系是多对多的,那么您必须创建模型角色和用户,然后在角色模型中编写以下代码: 公共功能用户() { 返回$this->belongaToMany('App/User'); }

在用户模型中:

public function roles()
{
return $this->belongsToMany('App/Role')
}
之后,创建一个新的迁移,并将表名role_user放入其中,并将下面的代码放入其中:

public function up()
{
Schema::create('category_post', function (Blueprint      $table){
$table->increments('id')->unsigned();
$table->integer('post_id')->unsigned()->index();
$table->integer('category_id')->unsigned()->index();
$table->timestamps();
$table->foreign('category_id')
->references('id')->on('categories')
->onUpdate('cascade')
->onDelete('cascade');$table->foreign('post_id')
->references('id')->on('posts')
->onUpdate('cascade')
->onDelete('cascade');
});
}
保存它并运行php artisan迁移。 它结束了,现在你有了多对多的关系。 在完成所有这些之后,例如获取查询相关角色到用户的示例将用户和角色模型添加到控件中,然后执行以下操作:

    public function edit($id){
    $user=User::whereId($id)->firstOrFail();
    $roles=Role::all()
    $selectedRole=$user->roles()->lists('id')->toArray();
    return view('your page          view',compact($user,$roles,$selectedRole));
    }
要在视图中显示所选角色,请执行以下操作:

<select id="role" name="role[]" multiple>
@foreach($roles as $role)
<option value="{!! $role->id !!}" @if(in_array($role->id,    $selectedRoles)) selected="selected" @endif >
{!! $role->display_name !!}
</option>
@endforeach
</select>

@foreach($roles作为$role)
id,$selectedRoles)selected=“selected”@endif>
{!!$role->display\u name!!}
@endforeach

它完成了。

偶然发现了同样的问题并找到了解决方案@


您还可以尝试以下DB::connection()->getPdo()->exec(“您的sql查询”);它起作用了

class CreateCompaniesView extends Migration 
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            DB::connection()->getPdo()->exec("CREATE VIEW companie ...");
        }

        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            DB::connection()->getPdo()->exec("DROP VIEW companies ...");
        }
    }

我已经创建了一个用于创建、重命名和删除视图的包:

您可以提供查询生成器实例或SQL字符串:

use Staudenmeir\LaravelMigrationViews\Facades\Schema;

class CreateOverallReportView extends Migration 
{
    public function up()
    {
        $query = DB::table('user_roles as er')->[...];
        $query = 'SELECT [...] FROM `user_roles` er [...]';

        Schema::createView('views_overall_report', $query);
    }

    public function down()
    {
        Schema::dropView('views_overall_report');
    }  
}

使用up函数中的“创建或替换”这样编写迁移:

public function up()
   {

    DB::statement('CREATE OR REPLACE VIEW my_view AS SELECT name FROM users');
   }

public function down()
    {
        DB::statement('DROP VIEW my_view');
    }
您可以这样做:

public function up()
{
  DB::statement($this->dropView());
  DB::statement($this->createView());
}

private function dropView(): string
{
   return <<<SQL
   DROP VIEW IF EXISTS `meter_reading_reports`;
   SQL;
}

private function createView(): string
{
   return <<<SQL
   CREATE VIEW `meter_reading_reports` AS
   SELECT /* … The query */
   SQL;
}

请参阅:

@Francescodeguentenaere链接文档有何帮助。@nullwriter查看此帖子的历史记录,最初他无法找到文档,因此我将其发布在评论中(而不是作为实际答案发布)。你可以将我的评论标记为过时。我以前做过。实际上,您可以使用视图直接创建正常的雄辩模型。php artisan make:model ViewOverallReport。然后,您可以简单地使用$v=ViewOverallReport::all()作为示例来在控制器中使用。创建视图后,我在运行
php artisan migrate
时出错。更改SQL语句以创建或替换视图修复了该问题。我熟悉通过Elount管理关系,但我在这里谈论的是创建SQL视图…非常好的解决方案)
public function up()
{
  DB::statement($this->dropView());
  DB::statement($this->createView());
}

private function dropView(): string
{
   return <<<SQL
   DROP VIEW IF EXISTS `meter_reading_reports`;
   SQL;
}

private function createView(): string
{
   return <<<SQL
   CREATE VIEW `meter_reading_reports` AS
   SELECT /* … The query */
   SQL;
}
class MeterReadingReport extends Model
{
   protected $casts = [
      'day' => 'date',
   ];
   public function unit(): BelongsTo
   {
      return $this->belongsTo(Unit::class);
   }

   public function user(): BelongsTo
   {
      return $this->belongsTo(User::class);
   }
}