Невозможно задать пустое свойство

Я сталкиваюсь с этой ошибкой { "сообщение": "Невозможно установить пустое свойство", "url": "/function-list/get-products-function", "code": 500, "file": "/var/www/ html/vendor/cakephp/cakephp/src/Datasource/EntityTrait.php", "строка": 238 }

Я считаю, что я сделал всю инициализацию переменных и массивов перед присвоением значений я получаю эту ошибку, когда я помещаю код в получение продукта $ и назначаю его переменным, а затем получаю доступ к нему для назначения в массиве $ row_data с индексом подключенных продуктов.

public function getProductsFunction()
{
    $this->autoRender = false;

    $product = $_POST['product'];

    $functionsTable = TableRegistry::get('functions');
    $functionsCapabilitiesTable = TableRegistry::get('function_capabilities');
    $functionsRelationsTable = TableRegistry::get('function_relations');

    $functions = $functionsTable->findByProductAndDeleted($product, 0)->toArray();

    $result = [];
    foreach ($functions as $function) {
        $products = $functionsRelationsTable->find()
        ->select(['product_name' => 'Products.name'])
        ->innerJoinWith('Products')
        ->where(['function_id' => $function['id'], 'function_id_2' => 0]);

        $results = $products->toArray();

        $productNames = [];
        foreach ($results as $result) {
            $productNames[] = $result['product_name']; // Extract product names
        }

        debug($productNames);
        exit;

        $no_of_capabilities = $functionsCapabilitiesTable->findByFunctionId($function['id'])->count();
        $row_data = [];
        $row_data['function_name'] = $function['name'];
        $row_data['no_of_capabilities'] = '<a target = "_blank" href = "/function-list/capabilities/' . $function['id'] . '">' . $no_of_capabilities . '</a>';
        $row_data['linked_functions'] = 0;
        $row_data['connected_products'] = implode(', ', $productNames); // Join product names into a string
        $row_data['action'] = '<button class = "btn btn-primary btn-edit" data-id = "' . $function['id'] . '">Edit</button>
                       <button class = "btn btn-danger btn-delete" data-id = "' . $function['id'] . '">Delete</button>';

        $result[] = $row_data;
    }

🤔 А знаете ли вы, что...
PHP можно использовать для создания графических диаграмм и графиков.


50
1

Ответ:

Решено

Сообщение об ошибке, с которым вы сталкиваетесь, «Невозможно установить пустое свойство», обычно возникает, когда вы пытаетесь установить свойство или значение для объекта или массива, который не инициализирован или не пуст. Судя по предоставленному вами коду, ошибка, скорее всего, возникает в следующей строке:

$row_data['connected_products'] = implode(', ', $productNames);

Ошибка предполагает, что массив $productNames пуст или не инициализирован. Глядя на ваш код, я вижу, что вы пытаетесь заполнить массив $productNames во внутреннем цикле, где вы перебираете массив $results. Однако похоже, что вы по ошибке повторно использовали имя переменной $result как для внешнего, так и для внутреннего цикла. Это может привести к неожиданному поведению и перезаписать ожидаемое значение $results.

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

$result = [];
foreach ($functions as $function) {
    $products = $functionsRelationsTable->find()
        ->select(['product_name' => 'Products.name'])
        ->innerJoinWith('Products')
        ->where(['function_id' => $function['id'], 'function_id_2' => 0]);

    $productResults = $products->toArray();

    $productNames = [];
    foreach ($productResults as $productResult) {
        $productNames[] = $productResult['product_name']; // Extract product names
    }

    // ... Rest of the code ...

    $row_data['connected_products'] = implode(', ', $productNames); // Join product names into a string

    // ... Rest of the code ...
}

Используя другое имя переменной $productResults во внутреннем цикле, вы избежите перезаписи переменной $results внешнего цикла, а массив $productNames должен быть заполнен правильно.