Ошибка типа недопустимого смещения
У меня есть страница, которая показывает детали одного теста. По какой-то причине я не могу обойти эту ошибку, даже чтобы отправить $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);
}