Как создать миграцию для просмотра базы данных с помощью php artisan в Laravel?
На самом деле, мне удалось создать sql-представления для Laravel, используя PHP Artisan, используя следующий шаг.
Шаг 1. Запустите команду ниже:
php artisan make:migration create_overall_report_views
Шаг 2.
Откройте файл миграции и добавьте следующий код:
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');
}
}
Шаг 3. Вызов и запуск представлений SQL через запрос Laravel
$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);
Надеюсь, что это поможет. Пожалуйста, дайте мне знать, если у кого-то есть лучшее решение!
Ответы
Ответ 1
Наткнулся на ту же проблему и нашел решение @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");
}
}
Ответ 2
Вы также можете попробовать этот 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 ...");
}
}
Ответ 3
Я создал пакет для создания, переименования и удаления просмотров:
https://github.com/staudenmeir/laravel-migration-views
Вы можете предоставить экземпляр построителя запросов или строку 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');
}
}
Ответ 4
Вы должны использовать laravel eloquent, чтобы создать связь между вашей моделью.
Например:
Если у вас есть 2 таблицы (роли, пользователи), а отношение между ними много для многих, вам необходимо создать для модели Роль и Пользователь, после чего в Ролевой модели напишите код ниже: пользователи публичных функций() { return $this- > ownaToMany ('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 migrate.
Его закончено, и теперь у вас много отношения.
После всего этого для получения запроса forexample для связанной роли пользователю добавьте свою модель User and Role к вашему контроллеру, сделайте вот так:
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>
Готово.