Ошибка типа недопустимого смещения

У меня есть страница, которая показывает детали одного теста. По какой-то причине я не могу обойти эту ошибку, даже чтобы отправить $id, Вот мой контроллер:

public function show($id)
{
    $data =DB::table('TestCase')->where('TestCaseID', $id);
    return view('managements.testcase-details')->with($data);
}

Вот ошибка:

в строке 180 View.php в HandleExceptions->handleError('2', 'Недопустимый тип смещения', 'C:\xampp\htdocs\terkwazmng\vendor\laravel\framework\src\Illuminate\View\View.php', '180', массив ('key' => object(Builder), 'value' => null))

5 ответов

Решение

Вы немного забыли. get и установить имя переменной данных. Ваша ошибка означает, что вы передаете конструктор запросов, а не его результаты. Вторая ошибка в том, что вы передаете NULL значение (второй параметр в with).

$data =DB::table('TestCase')->where('TestCaseID', $id)->get();
return view('managements.testcase-details')->with('data', $data);

В связи с использованием data как вы используете массив: foreach($data ...),

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

Класс, который мы хотим использовать -

<?php

namespace App;

use App\Helpers\ModelMPK; //MPK stands for Multi-column Primary Key handling

class AccountSession extends ModelMPK
{
    protected $hidden = ["account_id", "id"];
    protected $primaryKey = ['account_id', 'session'];
    public $incrementing = false;
}

Настроенный класс модели, я скопировал функцию откуда-то, я не могу ссылаться на него здесь, потому что не могу получить ресурсный URL, откуда я это получаю

<?php

namespace App\Helpers;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class ModelMPK extends Model
{
    /**
     * Set the keys for a save update query.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    protected function setKeysForSaveQuery(Builder $query)
    {
        $keys = $this->getKeyName();
        if(!is_array($keys)){
            return parent::setKeysForSaveQuery($query);
        }

        foreach($keys as $keyName){
            $query->where($keyName, '=', $this->getKeyForSaveQuery($keyName));
        }

        return $query;
    }

    /**
     * Get the primary key value for a save query.
     *
     * @param mixed $keyName
     * @return mixed
     */
    protected function getKeyForSaveQuery($keyName = null)
    {
        if(is_null($keyName)){
            $keyName = $this->getKeyName();
        }

        if (isset($this->original[$keyName])) {
            return $this->original[$keyName];
        }

        return $this->getAttribute($keyName);
    }
}

моя проблема: в моей таблице не было столбца автоинкремента, и laravel пытался получить доступ к столбцу автоинкремента, потому что Laravel предполагает, что каждая таблица имеет идентификатор автоинкремента, поэтому Laravel прислал мне эту ошибку.

решение: добавить к вашему классу модели

Я добавил это в модель

        приложение namespace;
        использовать Illuminate\Database\Eloquent\Model;
        использовать Illuminate\Database\Eloquent\Builder;

        Класс холдинга расширяет модель
        {
            public $timestamps = false;
            public $incrementing = false;
          public $keyType = 'string';
            защищенный $ table = 'tb_holding';
            protected $ primaryKey = ['qsymbol', 'id_user'];
            protected $ fillable = ['qsymbol', 'qlotbuy', 'qbuyprice', 'qstoploss', 'qlaststopls', 'qbuydate', 'idnote', 'id_user'];


            // ---> Недопустимый тип смещения при обновлении модели 
            // ---> потому что первичный ключ больше 1 -> добавить это
            //https://laracasts.com/discuss/channels/laravel/illegal-offset-type-while-updating-model?page=1
            защищенная функция setKeysForSaveQuery(Builder $query)
            {
                вернуть $query->where('qsymbol', $this->getAttribute('qsymbol'))
                             -> где ('id_user', $this->getAttribute('id_user'));
            }


Если вы хотите вернуть конкретную запись идентификатора, используйте это

      use app\Model;
    public function show($id){
    $data =Model::select('n.data')->findOrFail($id);
    return view('managements.testcase-details')->with($data);
    }
Другие вопросы по тегам