Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 22.06.2018 17:46:25

После создания новой модели, предыдущая не может быть найдена

У меня был рабочий код, я решил создать новую модель

Comment

и миграцию. Я выполнил 2 команды в командной строке,

php artisan make:model Comment

- создал модель и

php artisan make:migration create_comments_table

- создал новую миграцию, после этого выполнил ещё одну команду -

php artisan migrate:fresh --seed

, чтобы база данных обновилась. Модель

Comment

выглядит следующим образом:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
    protected $fillable = [
        'description', 'spot_id'
    ];

    public function spot()
    {
        return $this->belongsTo('App\Spot');
    }
}

Миграция выглядит так:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateCommentsTable extends Migration
{
    public function up()
    {
        Schema::create('comments', function (Blueprint $table) {
            $table->increments('id');
            $table->text('description');
            $table->integer('spot_id')->unsigned();
            $table->foreign('spot_id')->references('id')->on('spots');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('comments');
    }
}

Также в модель

Spot

, которая у меня уже была, я добавил метод

comments

и теперь модель выглядит так:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Spot extends Model
{
    protected $fillable = [
        'lat', 'lng', 'description', 'user_id'
    ];

    public function videos()
    {
        return $this->hasMany('App\Video');
    }

    public function tricks()
    {
        return $this->belongsToMany('App\Trick')->withTimestamps();
    }

    public function images()
    {
        return $this->hasMany('App\Image')->withTimestamps();
    }

    public function user()
    {
        return $this->hasOne('App\User');
    }

    public function comments()
    {
        return $this->hasMany('App\Comment');
    }
}

После этих действий любая страница где используется модель

Spot

перестала работать, ошибка отлавливается в любом контроллере где используется модель

Spot

, сама ошибка

Class 'App\Spot' not found

.2Od2q.png

После отката миграции, удалении метода

comments

из модели

Spot

и удалении модели

Comment

появляется другая ошибка-

include(D:\Install\XAMPP\htdocs\parkour\vendor\composer/../../app/Comment.php): failed to open stream: No such file or directory

aMSHK.png

Не в сети

#2 22.06.2018 18:06:34

Re: После создания новой модели, предыдущая не может быть найдена

Разобрался, помогла команда

composer dump-autoload

. Буду благодарен, если кто-то объяснит мне почему произошла такая ошибка и пришлось использовать эту команду, до этого модели и миграции нормально и без этой команды работали. И что за команда

php artisan clear-compiled

, она заменяет вышеуказанную?

Не в сети

#3 22.06.2018 18:14:20

Re: После создания новой модели, предыдущая не может быть найдена

php artisan clear-compiled

Эта команда так-же выполняет composer du (composer dump-autoload).

Покажи composer.json.

В PHP нет из коробки поддержки автоподгрузки класса по его namespace, но тем не менее, классы почему-то автоматически подгружаются. Советую разобраться с spl_autoload_register и psr-4. Без понимания этих мезанизмов не редко возникают проблемы (например, если в классе есть синтаксическая ошибка, то не редко ты увидишь ошибку Class not found, а не ошибку компиляции).

Изменено covobo (22.06.2018 18:14:46)

Не в сети

#4 22.06.2018 18:22:18

Re: После создания новой модели, предыдущая не может быть найдена

composer.json

{
    "name": "laravel/laravel",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "license": "MIT",
    "type": "project",
    "require": {
        "php": "^7.1.3",
        "fideloper/proxy": "^4.0",
        "laravel/framework": "5.6.*",
        "laravel/tinker": "^1.0"
    },
    "require-dev": {
        "barryvdh/laravel-debugbar": "^3.1",
        "filp/whoops": "^2.0",
        "fzaninotto/faker": "^1.4",
        "mockery/mockery": "^1.0",
        "nunomaduro/collision": "^2.0",
        "phpunit/phpunit": "^7.0"
    },
    "autoload": {
        "classmap": [
            "database/seeds",
            "database/factories"
        ],
        "psr-4": {
            "App\\": "app/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    },
    "extra": {
        "laravel": {
            "dont-discover": [
            ]
        }
    },
    "scripts": {
        "post-root-package-install": [
            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ],
        "post-create-project-cmd": [
            "@php artisan key:generate"
        ],
        "post-autoload-dump": [
            "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
            "@php artisan package:discover"
        ]
    },
    "config": {
        "preferred-install": "dist",
        "sort-packages": true,
        "optimize-autoloader": true
    },
    "minimum-stability": "dev",
    "prefer-stable": true
}

Не в сети

Подвал раздела