Обновить объект в цикле foreach

Мне нужно проверить, существует ли идентификатор в массиве в моей базе данных, если мне нужно поставить какой-то «флаг» в один из столбцов, но у меня с этим проблема.

$ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);

    curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
    $fields = curl_exec($ch);

    $reader = Reader::createFromString($fields, 'r')
        ->setDelimiter(',');

    $records = $reader->getRecords(['id_pr']);

    foreach ($records as $offset => $record) {
        $product = $this->productsRepository->findOneBy(['id_pr' => $record['id_pr']]);

This is where i need to update my DB, for each record i need to update 
column 'flag' by eg. '1' but i dont know how :(

    }
    curl_close($ch);

Я пробовал что-то вроде $product->setFlag(1); но я не могу звонить сеттерам или геттерам

Это дает мне ошибку: вызов функции-члена setFlag() на null

Вот как выглядит моя сущность «Продукты»:

class Products
{    

/**
 * @ORM\Column(type = "integer")
 */
private $id_pr;
/**
 * @ORM\Column(type = "integer", nullable=true)
 */
private $flag;

public function getIdPr(): ?int
{
    return $this->id_pr;
}

public function setIdPr(int $id_pr): self
{
    $this->id_pr = $id_pr;

    return $this;
}

/**
 * @return mixed
 */
public function getFlag()
{
    return $this->flag;
}

/**
 * @param mixed $flag
 */
public function setFlag($flag): void
{
    $this->flag = $flag;
}

Почему вы не можете вызывать сеттеры или геттеры? Можете ли вы показать, какие ошибки вы получаете? Может быть, также показать, как выглядит ваш Product-entity.

dbrumann 10.02.2019 23:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
494
1

Ответы 1

foreach ($records as $offset => $record) {
    $product = $this->productsRepository->findOneBy(['id_pr' => $record['id_pr']]);
    if ($product) {
        $product->setFlag($flagValue);
        $this->getDoctrine()->getManager()->flush(); //I'm assuming that you're in a controller
    }
}
EntityManager::flush, вероятно, следует назвать циклом после. Также: это getDoctrine() (отсутствует скобка)
ccKep 10.02.2019 23:59

Цикл начался, но PHPStorm не обнаруживает метод setFlag, поэтому я думаю, что он не работает, но сейчас у меня другая проблема, у меня более 144 тыс. записей в моей БД, и цикл выдал мне ошибку: /orm/lib/Doctrine/ORM /Internal/Hydration/SimpleObjectHydrato‌​r.php в строке 137 PHP Неустранимая ошибка: допустимый размер памяти 134217728 байт исчерпан (попытка выделить 32768 байт) в /application/vendor/symfony/debug/Exception/OutOfMemoryExcep‌​tion.php в строке 1 :(

jakmen 11.02.2019 00:05

@ccKep да, скобки пропущены. Что делает EntityManager::flush? Я еще не использую sf4, поэтому не знаю этого. @jakmen твоя проблема с памятью, вероятно, связана с чем-то другим.

Preciel 11.02.2019 00:07

Я просто имел в виду, что вам, вероятно, следует вызывать $this->getDoctrine()->getManager()->flush()после в цикле, а не внутри него. Это вызов, который фактически отправляет все запросы к базе данных.

ccKep 11.02.2019 01:09

@jakmen Это может быть полезно для вас: Документы Doctrine в пакетной обработке.

ccKep 11.02.2019 01:10

Кроме того, для того, чтобы phpStorm определил тип возвращаемого значения, просто укажите его с помощью phpdoc (например, поместите /** @var Product */ в строку выше вашего вызова $product =, при условии, что ваша сущность называется Product и у вас есть соответствующий оператор use ... для него в вашем файле)

ccKep 11.02.2019 01:12

Другие вопросы по теме