Я мой route.php У меня есть следующий контент:
<?php
Route::group(array(), function () {
View::share('roots', Category::roots()->get());
$tree = Category::get()->toHierarchy()->toArray();
View::share('categories', $tree);
Route::get('/', array('as' => 'home', 'uses' => 'HomeController@index'));
});
Когда в моей базе данных еще нет таблиц, и я хочу сделать php artisan migrate
результат: SQLSTATE [42S02]: Базовая таблица или представление не найдено: 1146 Таблица «ae_dev.categories» не существует
Мой файл миграции:
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateCategoriesTable extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up() {
Schema::create('categories', function(Blueprint $table) {
$table->increments('id');
$table->integer('parent_id')->nullable()->index();
$table->integer('lft')->nullable()->index();
$table->integer('rgt')->nullable()->index();
$table->integer('depth')->nullable();
$table->string('name', 255);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down() {
Schema::drop('categories');
}
}
Я думаю, что Laravel в трей, чтобы вызвать Category из rout.php и хочу сделать select или somethink, поэтому я хочу запустить миграцию, которая создает таблицу категорий, но вышеупомянутая ошибка возникает раньше …
Как я могу это исправить?
Кажется, что все php artisan
использование команд routes.php
файл, поэтому, когда вы попытаетесь в этом файле получить доступ к таблицам базы данных (а таблицы не существуют, потому что вы не запустили миграцию), вы получите эту ошибку. И ты не можешь бежать php artisan migrate
потому что вы получаете эту ошибку.
Одним из решений является удаление кода, который запрашивает базу данных, но это, конечно, не хорошее решение. Итак, что вам нужно сделать, это выбрать таблицу из первой миграции, которую вы когда-либо делали (в вашем случае это, вероятно, categories
, Позже у вас будет больше миграций, но это будет первым) и добавьте что-то вроде этого:
if (!Schema::hasTable('categories'))
{
return;
}
в ваш routes.php
файл.
Однако, если вы будете больше играть с миграциями и вам понадобятся и другие таблицы для запросов, вам нужно изменить вышеуказанное условие, например, на:
if (!Schema::hasTable('categories') || !Schema::hasTable('users'))
{
return;
}
но это все равно вызовет некоторые проблемы — вы не хотите запускать этот код каждый раз на своих маршрутах, поэтому я бы сделал это следующим образом:
if ($env == 'local') {
if (!Schema::hasTable('categories') || !Schema::hasTable('users'))
{
return;
}
}
Вы должны настроить свою среду, конечно. Но теперь вы запускаете этот код только для локальной среды, на производстве этот код запускаться не будет, поэтому он не повлияет на производительность приложения. Конечно, я предполагаю, что вы не будете играть с ремесленником на производстве.
РЕДАКТИРОВАТЬ
Но если вы используете запросы только для обмена данными (а не для маршрутов), я бы переместил эти строки:
View::share('roots', Category::roots()->get());
$tree = Category::get()->toHierarchy()->toArray();
View::share('categories', $tree);
в BaseController
и запустить метод (или родительский конструктор) во всех контроллерах, которые его расширяют.
Старый ответ (в данном случае неадекватный)
Информация об ошибке достаточно ясна из вашего объяснения, что в вашей базе данных еще нет таблиц. Вы не можете выполнять запросы к базе данных, если у вас нет таблиц.
В вашей миграции вы должны создать необходимые таблицы, например, это миграция для пользовательской таблицы:
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class NewUser extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('users', function ($table) {
$table->engine = 'InnoDB';
$table->increments('id');
$table->string('user_name', 60)->unique();
$table->string('email', 120)->unique();
$table->string('passwd', 256);
$table->decimal('balance', 8, 2);
$table->rememberToken();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
Schema::drop('users');
}
}
Вы также не должны вставлять данные в базу данных при использовании миграции (как вы, вероятно, делаете сейчас). Вы должны сделать это в то время как посевные столы.
Других решений пока нет …