Wie erstelle ich die Migrationen für Datenbankansichten mit PHP Artisan in Laravel?

Lesezeit: 3 Minuten

Benutzer-Avatar
rc.adhikari

Tatsächlich habe ich es geschafft, SQL-Ansichten für Laravel mit PHP Artisan mit dem folgenden Schritt zu erstellen.

Schritt 1. Führen Sie den folgenden Befehl aus:

php artisan make:migration create_overall_report_views

Schritt 2.

Öffnen Sie die Migrationsdatei und fügen Sie den folgenden Code hinzu:

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

}

Schritt 3. Aufrufen und Ausführen der SQL-Ansichten über die Laravel-Abfrage

$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);

Ich hoffe, das hilft. Bitte lassen Sie mich wissen, wenn jemand eine bessere Lösung hat !!

  • laravel.com/docs/master/migrations

    – Francesco de Guytenaere

    29. März 2016 um 14:45 Uhr

  • @FrancescodeGuytenaere, wie das Verknüpfen der Dokumentation hilfreich ist.

    – Nullschreiber

    6. Februar 2017 um 17:37 Uhr

  • @nullwriter Schauen Sie sich den Verlauf für diesen Beitrag an, anfangs konnte er die Dokumentation nicht finden, daher habe ich sie in einem Kommentar gepostet (anstatt sie als tatsächliche Antwort zu posten). Sie können meinen Kommentar als veraltet markieren.

    – Francesco de Guytenaere

    6. Februar 2017 um 18:27 Uhr


  • Ich habe das schon einmal gemacht. Sie können das normale Eloquent-Modell mithilfe der Ansicht tatsächlich gerade machen. php artisan make:model ViewOverallReport. Dann können Sie einfach $v = ViewOverallReport::all() als Beispiel verwenden, um es im Controller zu verwenden

    – Apit John Ismail

    13. Oktober 2017 um 11:35 Uhr

  • Sobald die Ansicht erstellt wurde, erhielt ich beim Ausführen einen Fehler php artisan migrate. Das Ändern der SQL-Anweisung in CREATE OR REPLACE VIEW hat das Problem behoben.

    – Kevin Marsden

    8. Januar 2021 um 6:58 Uhr

Benutzer-Avatar
Peon

Stolperte über das gleiche Problem und fand die Lösung @ http://programmingarehard.com/2013/11/10/eloquent_and_views.html/

class CreateCompaniesView extends Migration 
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        DB::statement("CREATE VIEW companiesView AS
                        SELECT *,
                        (
                            SELECT GROUP_CONCAT(DISTINCT id SEPARATOR ',')
                            FROM people AS p
                            WHERE p.company_id = c.id
                        ) AS person_ids
                        FROM companies AS c");
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        DB::statement("DROP VIEW companiesView");
    }
}

Benutzer-Avatar
Márcio Carvalho

Du kannst das:

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;
}

Jetzt, da wir eine Migration durchgeführt haben, funktioniert alles andere wie normales Laravel!

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);
   }
}

Verweisen: https://stitcher.io/blog/eloquent-mysql-views

  • Können Sie bitte die Syntax der Abfrage erklären? Ich weiß nicht, was der <<<-Operator macht und warum er mit SQL endet;

    – Elia7

    2. März um 18:50 Uhr

Ich habe ein Paket zum Erstellen, Umbenennen und Löschen von Ansichten erstellt:
https://github.com/staudenmeir/laravel-migration-views

Sie können eine Query Builder-Instanz oder eine SQL-Zeichenfolge bereitstellen:

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

Schreiben Sie Ihre Migration so, mit ‘CREATE OR REPLACE’ in der Up-Funktion:

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

Benutzer-Avatar
Julian Martinez

Sie können dies auch versuchen DB::connection()->getPdo()->exec(“your sql query”); Es klappt

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 ...");
        }
    }

1245960cookie-checkWie erstelle ich die Migrationen für Datenbankansichten mit PHP Artisan in Laravel?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy