#laravel
#laravel
Вопрос:
Я делаю следующие 3 шага:
- Вставка записей из основной таблицы во временную таблицу
- Отображение временной таблицы в таблице данных
- Редактирование записей в таблице данных и обновление таблицы Mem.
Итак, шаг 1 без проблем, я могу вставлять записи во временную таблицу с помощью команды Model::Create . Шаг 2 нет проблем, я также могу перенести эти записи в таблицу данных и также могу видеть эти недавно вставленные записи во временной таблице в MySQL.
Проблема связана с шагом 3. Когда я нажимаю кнопку редактирования в таблице данных, выдается сообщение об ошибке «сообщение»: «Попытка прочитать свойство «PMDTDUniqueId» на null», поэтому оно не распознает вновь вставленные записи, даже когда я вижу это в вводе кода hereMySQL и таблице данных.
Почему он должен вести себя так? Любая помощь будет оценена.
// Inserting Records from Master table to Temp Table
public function PMDTH11AppendMemTableTrait()
{
$loginName = Auth::user()->name;
// Delete Records for this user first
MemIncomeType::where('PMDTDUser', $loginName)->delete();
$Master = IncomeType::orderBy('PMITHUniqueId')->get();
$LineNo = 10;
foreach ($Master as $key => $value) {
MemIncomeType::create([
'PMDTDUniqueIdH' => $LineNo,
'PMDTDIncomeId' => $value->PMITHIncomeId,
'PMDTDIncomeIdK' => $value->PMITHIncomeIdK,
'PMDTDDesc1' => $value->PMITHDesc1,
'PMDTDIsSelect' => 0,
'PMDTDDedPercent' => 100,
'PMDTDUser' => $loginName
]);
$LineNo ;
}
}
// Редактирование записи, которая была недавно вставлена, как указано выше
public function PMDTH11FethchEditedSubFormDataTrait($request)
{
$PMDTDUniqueId = $request->input('id');
$MemIncomeType = MemIncomeType::find($PMDTDUniqueId);
// $MemIncomeType = MemIncomeType::where('PMDTDUniqueId', $PMDTDUniqueId)->get();
// echo 'Data Submitted.';
// echo "<pre>";
// print_r($MemIncomeType);
// die();
return $output = array(
'PMDTDUniqueId' => $MemIncomeType->PMDTDUniqueId,
'PMDTDIncomeId' => $MemIncomeType->PMDTDIncomeId,
'PMDTDDesc1' => $MemIncomeType->PMDTDDesc1,
'PMDTDDedPercent' => $MemIncomeType->PMDTDDedPercent
);
}
В приведенной выше функции ‘PMDTH11FethchEditedSubFormDataTrait’ я получаю сообщение об ошибке.
Модель, которую я объявил для MemIncomeType
namespace AppModelsPayrollIncomeDeductionType;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;
class MemIncomeType extends Model
{
use HasFactory;
public $timestamps = false;
protected $table = 'zmem11906l0211';
protected $primaryKey = 'PMDTDUniqueId';
protected $fillable =
[
'PMDTDUniqueId',
'PMDTDUniqueIdH',
'PMDTDIncomeId',
'PMDTDIncomeIdK',
'PMDTDDesc1',
'PMDTDIsSelect',
'PMDTDDedPercent',
'PMDTDUser',
];
}
Комментарии:
1. При использовании find() он использует ваш первичный ключ, как определено в миграции вашей базы данных, вы можете опубликовать это? Возможно ли, что это не ваш первичный ключ?
2. «Eloquent также предполагает, что соответствующая таблица базы данных каждой модели имеет столбец первичного ключа с именем id . При необходимости вы можете определить защищенное свойство $PrimaryKey в вашей модели, чтобы указать другой столбец, который служит первичным ключом вашей модели «. — laravel.com/docs/8.x/eloquent#primary-keys
3. Я даже опубликовал модель для MemIncomeType. Забавная часть: когда я запускаю эту программу и нажимаю событие, она добавляет записи и показывает в DB, а также в Datatable, но не позволяет мне редактировать какие-либо записи, поскольку она не находит записи в этой таблице. Но если я прокомментирую эту функцию создания таблицы mem при событии click и выполню ту же программу, теперь тот же код, приведенный выше, позволяет мне редактировать эти записи. Для меня функция AppendMemTable вставляет записи в БД, но внутренне Laravel не распознает эту вставку.
4. @Danny Ebbers если вы посмотрите на функцию ‘PMDTH11FethchEditedSubFormDataTrait’ и, в частности, на третью строку, которая прокомментирована. Я попытался выбрать записи, используя предложение where вместо find. Но это также принесло мне нулевые записи. Я проверил это, используя этот небольшой способ отладки, который прокомментирован в 4-7 строках. Я надеюсь, что это прояснит ваши сомнения по поводу Find. Я знаю, что поиск работает только с id. Мы явно объявили наш идентификационный ключ в модели как ‘protected $PrimaryKey = ‘PMDTDUniqueId’;’.
5. Попробуйте
MemIncomeType::findOrFail()
и следите за исключением. Проверьте журналы запросов к базе данных, чтобы узнать, что происходит.