Красноречивая модель возвращается как строитель - PullRequest
3 голосов
/ 19 июня 2020

Я заново учусь Laravel с laravel 7 и обнаружил проблему, при которой я не могу запросить запись в моей таблице базы данных. Таким образом, вместо вызова типа $test = Test::find_by_id_and_name(1, 'test 1'); (а также $test = Test::where('id', 1);, возвращающего класс Illuninate \ Database \ Eloquent \ Model, он возвращает класс Illuminate \ Database \ Eloquent \ Builder.

Я создал миграцию для таблицы под названием «Тесты» и засеял ее несколькими строками тестовых данных. Тестовая модель в приложении выглядит следующим образом:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Test extends Model
{
    protected $guarded = [];
    use SoftDeletes;

}

Миграция:

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

class CreateTestsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tests', function (Blueprint $table) {
            $table->id();
            $table->string( 'name' );
            $table->string( 'url', 255 );
            $table->timestamps();
            $table->softDeletes();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('tests');
    }
}

Так что кто угодно почему я не получаю нужную мне модель, поэтому я могу сделать, например, dd($test); и увидеть значения, хранящиеся в базе данных для строки с идентификатором 1? или даже сделать echo($test->name); и увидеть имя этого item?

спасибо

* ДОПОЛНИТЕЛЬНОЕ * Следует отметить, что мой исходный код имел Test :: find_by_id_and_name (1, 'test 1'); но этого не произошло работают и генерируют исключение о поиске класса. Я изменил if with where и выше был опечаткой, как и where ('id', 1); (Я исправил код, используя свой исходный код find_by). Добавление get ( ) или что-то другое теперь возвращает null. Я проверил, что dat abase содержит тесты таблицы и что элемент с идентификатором и именем 'test 1' существует

* РЕЗУЛЬТАТ * Основной проблемой в конечном итоге были данные, URL-адрес имел https: : // в нем (дополнительное двоеточие), поэтому он действительно вернет null. Спасибо, ребята, помогли мне найти причину.

Ответы [ 2 ]

3 голосов
/ 19 июня 2020

Непонимание построителя запросов и моделей в Laravel. Проверьте do c для справки.

Статический вызов метода построителя запросов в модели возвращает построитель.

User::where('id', 1); // returns builder

Чтобы разрешить построитель запросов, вы можете использовать get() или first().

User::where('id', 1)->get(); // Returns a collection of users with 1 element.
User::where('id', 1)->first(); // Returns one user.

Вы также можете получить пользователя из коллекций, это не рекомендуется, так как вы можете просто позвонить first().

User::where('id', 1)->get()->first(); // Returns collection fetches first element that is an user.

Laravel имеет stati c методы поиска моделей по id.

User::find(1); // returns user or null
User::findOrFail(1); // returns user or exception
1 голос
/ 19 июня 2020

Попробуйте использовать следующие

$test = Test::find(1);

Тогда вы получите запись

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...