Laravel на Windows

Изникна ми един проблем отново. Пиша по някакви туториали, и първоначално преправям класа User, правя миграция и създавам таблица в базата. До тук всичко е ок. Следващото нещо е да направя клас Author и по същия начин да направя миграция, но в момента в който дам php artisan migrate ми трещи тази грешка Base table or view not found: 1146 Table 'laravel_store.authors' doesn't exist. Пробвах какво ли не, dump-autoload, cache:clear, други имена на класа и миграцията, трих таблиците но винаги ми създава таблица само с миграцията на класа User. Кажете къде греша, от часове се боря вече.
 
teroristd каза:
Изникна ми един проблем отново. Пиша по някакви туториали, и първоначално преправям класа User, правя миграция и създавам таблица в базата. До тук всичко е ок. Следващото нещо е да направя клас Author и по същия начин да направя миграция, но в момента в който дам php artisan migrate ми трещи тази грешка Base table or view not found: 1146 Table 'laravel_store.authors' doesn't exist. Пробвах какво ли не, dump-autoload, cache:clear, други имена на класа и миграцията, трих таблиците но винаги ми създава таблица само с миграцията на класа User. Кажете къде греша, от часове се боря вече.

Дай си миграцията. Очевидно не създаваш таблицата, а си казал, че ще модифицираш вече съществуваща таблица, което не е така. (Щом ти дава, че authors таблицата не съществува.)

PS:
Относно:

dump-autoload, cache:clear

Прочети какво правят, за да не пробваш безмислени неща, които няма да помогнат в някакви случаи. Просто е губене на време :(
 
Това е миграцията.

Код:
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateAuthorsTable extends Migration
{
    public function up()
    {
        Schema::table('authors', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('surname');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::table('authors', function (Blueprint $table) {
            Schema::drop('authors');
        });
    }
}


Това е модела.

Код:
namespace App;

use Illuminate\Database\Eloquent\Model;

class Author extends Model
{
    protected $table = 'authors';
    protected $fillable = array('name', 'surname');
}

Да добавя за да се знае. Качва само миграцията на модела User, който си е по дефаулт в Laravel. Аз го променям до някаква степен. Направил съм конфига с името на моята база, също и .env файла.

Това е миграцията и модела User.
Код:
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('email');
            $table->string('password');
            $table->string('name');
            $table->integer('admin');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::drop('users');
    }
}

Код:
namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected $table = 'users';
    protected $hidden = array('password');
    protected $fillable = array('email', 'password', 'name', 'admin');

    public function getAuthIdentifier()
    {
        return $this->getKey();
    }

    public function getAuthPassword()
    {
        return $this->password;
    }

    public function getReminderEmail()
    {
        return $this->email;
    }
}
 
В миграцията ти за authors имаш:
Schema::table('authors', function (Blueprint $table)

A ти искаш да създадеш самата таблица и трябва да е така:
Schema::create('authors', function (Blueprint $table)

Т.е. ти си изпълнил следната команда:
php artisan make:migration imeto_na_migraciqta --table=authors

Вместо:
php artisan make:migration imeto_na_migraciqta --create=authors
 
Е, злато си @Fakeheal :) . Не можеш да си представиш през какво минах, а е било толкова елементарно. Хем ги гледах миграциите а това ми се е изплъзнало. Явно в туториала или е грешна командата или е някаква стара. Ето това дават и аз това пиша :D .

Код:
php artisan make:migration create_authors_table --table=authors --create
 
Другия път използвай това, когато сравняваш, за да не изпускаш такива видими грешки.

Виж тази книга. Добра е! Поне на мен ми помага много, когато ми трябва за нещо.
Ако не я намериш като PDF, ми пиши, аз я имам.
 
Revelation каза:
Другия път използвай това, когато сравняваш, за да не изпускаш такива видими грешки.

Виж тази книга. Добра е! Поне на мен ми помага много, когато ми трябва за нещо.
Ако не я намериш като PDF, ми пиши, аз я имам.

Благодаря, ако може изпрати ми книгата.
 
Междодругото другия път като пуснеш такава тема, нека да е в PHP раздела :)
 
Значи изскочи ми много странна грешка. Всъщност аз я оправих но ми е интересно защо се получава. В една от тблиците бях направил един seed два пъти и id-тата не ми започваха от 1. В темплейта когато вадя резултата ми трещи грешка.
Код:
@foreach($books as $book)
<p>Author : <b>{{$book->author->name}} {{$book->author->surname}}</b></p>
@endforeach
Като оправих id-тата в базата и всичко се оправи. Имате ли идея защо се получава така?
 
Какви са ти били id-тата и каква е била грешката? :)

Това, че си run-нал два пъти сийдъра не трябва да е проблем /да ти обърква id-тата/. По-скоро си объркал полето, в което си държиш primary key-a - id. Ако си правил таблицата с миграция, сигурен ли си, че си дал за полето да е auto increment:

Код:
$table->increments('id');
 
Да полето е auto increment. Имах три записа с ид-та 1,2,3 и втория run на seed-a го направих нарочно за да видя какво ще стане. Просто ми презаписа същите данни но с ид-та 4,5,6. Това е свързано не толкова със самия код а с базата. Забелязал съм че примерно ако изтрия някакви записи никога не ми замества изтритите ид-та ами си продължава от там до където са стигнали. Примерно имам 1 и 2, трия 2 добавям нов запис и той е ид 3, а 2 изчезва. Ето я и грешката, пускам само първите редове че е адски дълга, ако има нужда ще дам и останалото.

Код:
ErrorException in 286b656d102c62ee0cabe8c93aa4dfde1d5d3612.php line 13:
Trying to get property of non-object (View: C:\xampp\htdocs\Laravel\resources\views\book_list.blade.php)
in 286b656d102c62ee0cabe8c93aa4dfde1d5d3612.php line 13
at CompilerEngine->handleViewException(object(ErrorException), '1') in PhpEngine.php line 44
at PhpEngine->evaluatePath('C:\xampp\htdocs\Laravel\storage\framework\views/286b656d102c62ee0cabe8c93aa4dfde1d5d3612.php', array('__env' => object(Factory), 'app' => object(Application), 'errors' => object(ViewErrorBag), 'books' => object(Collection))) in CompilerEngine.php line 59
at CompilerEngine->get('C:\xampp\htdocs\Laravel\resources\views/book_list.blade.php', array('__env' => object(Factory), 'app' => object(Application), 'errors' => object(ViewErrorBag), 'books' => object(Collection))) in View.php line 149
at View->getContents() in View.php line 120
at View->renderContents() in View.php line 85
at View->render() in Response.php line 53
at Response->setContent(object(View)) in Response.php line 201
at Response->__construct(object(View)) in Router.php line 1085
at Router->prepareResponse(object(Request), object(View)) in ControllerDispatcher.php line 95
 
vinsbg каза:
Така дали няма да стане?
Код:
{{$book->author['name']}} {{$book->author['surname']}}

Така не ми вади грешка, обаче ако ид-тата са различни от 1,2,3 не ми визуализира и полетата. Все едно е записало някъде че трябва да са точно тези ид-та.
 
Мисля че открих в кой код е проблема. В контролера имам :

Код:
$books = Book::all();
return View::make('book_list')->with('books', $books);

Прочетох че Eloquent намалява заявките и пуска само 2 при with() функцията.

select * from books
select * from authors where id in (1, 2, 3, 4, 5, ...)

Въпросът е с какво да го заместя?
 
Fakeheal каза:
Дай си seed-a? :)

Код:
use Illuminate\Database\Seeder;
use App\Author;

class AuthorsTableSeeder extends Seeder
{
    public function run()
    {
        DB::table('authors')->delete();

        Author::create(array(
            'name' => 'Lauren',
            'surname'=>'Oliver'
        ));

        Author::create(array(
            'name' => 'Stephenie',
            'surname'=>'Meyer'
        ));

        Author::create(array(
            'name' => 'Dan',
            'surname'=>'Brown'
        ));

    }
}
 
teroristd каза:
Да полето е auto increment. Имах три записа с ид-та 1,2,3 и втория run на seed-a го направих нарочно за да видя какво ще стане. Просто ми презаписа същите данни но с ид-та 4,5,6. Това е свързано не толкова със самия код а с базата. Забелязал съм че примерно ако изтрия някакви записи никога не ми замества изтритите ид-та ами си продължава от там до където са стигнали. Примерно имам 1 и 2, трия 2 добавям нов запис и той е ид 3, а 2 изчезва. Ето я и грешката, пускам само първите редове че е адски дълга, ако има нужда ще дам и останалото.

Код:
ErrorException in 286b656d102c62ee0cabe8c93aa4dfde1d5d3612.php line 13:
Trying to get property of non-object (View: C:\xampp\htdocs\Laravel\resources\views\book_list.blade.php)
in 286b656d102c62ee0cabe8c93aa4dfde1d5d3612.php line 13
at CompilerEngine->handleViewException(object(ErrorException), '1') in PhpEngine.php line 44
at PhpEngine->evaluatePath('C:\xampp\htdocs\Laravel\storage\framework\views/286b656d102c62ee0cabe8c93aa4dfde1d5d3612.php', array('__env' => object(Factory), 'app' => object(Application), 'errors' => object(ViewErrorBag), 'books' => object(Collection))) in CompilerEngine.php line 59
at CompilerEngine->get('C:\xampp\htdocs\Laravel\resources\views/book_list.blade.php', array('__env' => object(Factory), 'app' => object(Application), 'errors' => object(ViewErrorBag), 'books' => object(Collection))) in View.php line 149
at View->getContents() in View.php line 120
at View->renderContents() in View.php line 85
at View->render() in Response.php line 53
at Response->setContent(object(View)) in Response.php line 201
at Response->__construct(object(View)) in Router.php line 1085
at Router->prepareResponse(object(Request), object(View)) in ControllerDispatcher.php line 95

delete() метода извършва DELETE заявки, за това следващите записи не ти заместват старите. Така работи базата данни. Ако направиш TRUNCATE, тогава ще ти се нулира auto increment индекса и ще започне броенето отначало.

with() не би трябвало да ограничава до 2 заявки. Плюс това, при Book::all() не би трябвало да има повече от 2.

В routes.php файла, можеш да добавиш това:

PHP:
Event::listen('illuminate.query', function($query)
{
    //var_dump($query);
});

за да следиш какви заявки ти се изпълняват.
 
Имаш предвид че ако го нямам този метод delete(), колкото и пъти да пусна seed винаги ид-тата ще почват от 1 така ли?

Но това все пак не обяснява от къде идва грешката. Аз може по някаква причина да не искам да почват 1. Примерно аз до сега като си викна някаква заявка не е имало никакво значение от колко почват ид-тата и дали са поредни или дали има дупки между тях :) .
 
teroristd каза:
Имаш предвид че ако го нямам този метод delete(), колкото и пъти да пусна seed винаги ид-тата ще почват от 1 така ли?

Но това все пак не обяснява от къде идва грешката. Аз може по някаква причина да не искам да почват 1. Примерно аз до сега като си викна някаква заявка не е имало никакво значение от колко почват ид-тата и дали са поредни или дали има дупки между тях :) .

Не, ако махнеш delete() просто ще си пълниш базата данни и id-тата ще са поредни. Просто като пускаш delete() ти триеш всички налични записи, без да нулираш auto increment-а и за това следващите записи започват примерно от 3, а не от 1.

Но да, това не е толкова проблема. И общо взето сега какво се получава? Не ти вади данните или ти тряска пак грешката. Дебъгни и виж какво ти връща $books, както и какви заявки точно ти изпълнява.

Двете база данни books и authors свързани ли са ти по някакъв начин?
 

Горе