Конта — спасение моей модели оставляет мне пустую модель

Я программирую модуль для Contao в php.
Я использую функцию «Model :: save ()», которая сохраняет мои данные в базу данных.
Но когда я пытаюсь использовать модель после сохранения, она просто пуста. Я понятия не имею, как это может произойти.
Фрагмент кода:

            $report->tstamp = time();
$report->machine_id = $machine_data['type_of_machine'];
var_dump($report);
echo "<br/>";
$report->save();
var_dump($report);
echo "<br/>";

Так что в var_dump перед сохранением все нормально, но второй не показывает никаких данных!
У кого-нибудь есть идеи?

Edit2:
Хорошо, вот полный код модуля:

<?phpuse Contao\Date;
use Contao\FilesModel;
use Contao\Input;
use Contao\Module;
use Contao\PageModel;
use Contao\RequestToken;
use Contao\Validator;

class ModuleReportData extends Module

{

protected $strTemplate = 'mod__reportdata';

public function generate()
{

if (TL_MODE == 'BE')
{
/** @var \BackendTemplate|object $objTemplate */
$objTemplate = new \BackendTemplate('be_wildcard');

$objTemplate->wildcard = '### ReportData ###';
$objTemplate->href = 'contao/main.php?do=themes&amp;table=tl_module&amp;act=edit&amp;id=' . $this->id;

return $objTemplate->parse();
}return parent::generate();
}

public function compile()
{

$report_id = Input::get('r');

if($report_id){
$report = ReportModel::findByPk($report_id);
$project = ProjectModel::findBy('report_id', $report_id);
}else{
$report = new ReportModel();
$project = new ProjectModel();
}
$machine = new MachineModel();

$machines = [];
$next_step = false;

//get data for selectbox machines
$result = $this->Database->prepare("SELECT * FROM tl_sa_machines")->execute();

while($result->next())
{
$id = $result->id;
$machines[$id] = $result->type;
}
//Check if form was submitted
if(Input::post('submit_data')){
$report_data = Input::post('report_data');
$project_data = Input::post('project_data');
$machine_data = Input::post('machine_data');

$errors = [];
$next_step = true;
foreach($report_data as $key => $data)
{
if(empty($data)) continue;
switch ($key) {
case 'document_date':
if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/", $data)) //###andere Formate hinzufügen
{
break;
}
else {
$next_step = false;
$errors[$key] ="Error";
break;
}
case 'customer':
if(Validator::isAlphanumeric($data)) break;
else {
$next_step = false;
$errors[$key] ="Error";
break;
}
case 'city':
if(Validator::isAlphanumeric($data)) break;
else {
$next_step = false;
$errors[$key] ="Error";
break;
}
case 'country':
if(Validator::isAlphanumeric($data)) break;
else {
$next_step = false;
$errors[$key] ="Error";
break;
}
case 'document_version':
if(Validator::isNumeric($data)) break;
else {
$next_step = false;
$errors[$key] ="Error";
break;
}
case 'author':
if(Validator::isAlphanumeric($data)) break;
else {
$next_step = false;
$errors[$key] ="Error";
break;
}
case 'max_speed':
if(Validator::isNumeric($data)) break;
else {
$next_step = false;
$errors[$key] ="Error";
break;
}
}

}
$report->setRow($report_data);

foreach($project_data as $key => $data)
{
if(empty($data)) continue;
if(Validator::isAlphanumeric($data)) continue;
else {
$next_step = false;
$errors[$key] = "Error";
}
}
$project->setRow($project_data);

if($next_step)
{
$project->date_of_evaluation = strtotime($project->date_of_evaluation);
$report->document_date = strtotime($report->document_date);

//save and set report_data
$report->tstamp = time();
$report->machine_id = $machine_data['type_of_machine'];
var_dump($report);
echo "<br/>";
$report->save();
var_dump($report);
echo "<br/>";
$report = ReportModel::findByPK($report_id);
var_dump($report);

//save and set project_data
$project->report_id = $report->id;
$project->tstamp = time();
$project->save();

//session for transfering report_id to the next page
/* var_dump($report->id);
var_dump($report_id);
var_dump($project->report_id);
if($report_id) {
$_SESSION['report_id'] = $report_id;
}
else
{//var_dump($report_id);
//var_dump($report->id);
$report_id = $report->id;
$_SESSION['report_id'] = $report_id;
}

$jumpTo = PageModel::findByPk($this->jumpTo);
$url = $this->generateFrontendUrl($jumpTo->row());

$this->redirect($url);*/
}
}

$this->Template->report = $report;
$this->Template->project = $project;
$this->Template->machine = $machine;
$this->Template->machines = $machines;
$this->Template->errors = $errors;

$this->Template->request_token = RequestToken::get();}

}

У меня есть форма для сохранения новых данных или для редактирования существующих данных. В базе данных есть две разные таблицы, которые я пытаюсь заполнить данными. Для второго мне нужен новый идентификатор новой строки, сгенерированной в этом коде. Но это не работает, потому что модель пуста после сохранения.

Edit3:
ProjectModel просто так:

    use Contao\Model;

class ProjectModel extends Model{
protected static $strTable = "tl_sa_projects";
}

Я только что узнал, что это происходит только тогда, когда я использую метод сохранения в $ report. Работает нормально с $ project!

Обновить:
Похоже, я получаю сообщение об ошибке, когда метод refresh () пытается выбрать новую вставленную базу данных:

    public function refresh()
{
$intPk = $this->{static::$strPk};

// Track primary key changes
if (isset($this->arrModified[static::$strPk]))
{
$intPk = $this->arrModified[static::$strPk];
}

// Reload the database record
$res = \Database::getInstance()->prepare("SELECT * FROM " . static::$strTable . " WHERE " . static::$strPk . "=?")
->execute($intPk);

var_dump($res);

$this->setRow($res->row());
}

Обновление 2:
Хорошо, проблема в том, что arrModified содержит пустую строку в качестве идентификатора. Кто-нибудь знает, где этот массив получает свои элементы?

0

Решение

Не ответ на ваш оригинальный вопрос, но вы должны использовать

ProjectModel::findOneBy('report_id', $report_id);

вместо

ProjectModel::findBy('report_id', $report_id);

так как вы хотите найти только один конкретный проект. findBy возвращает Contao\Model\Collection (то есть потенциально несколько результатов), тогда как findOneBy возвращает Contao\Model,

Обновить:

Кроме того, ваше использование setData а также mergeRow вероятно, не предназначен таким образом. Вы должны вместо этого использовать

foreach ($project_data as $key => $val)
{
$project->$key = $val;
}

например.

1

Другие решения

Других решений пока нет …