2012-04-27 11 views
5

Po raz pierwszy natrafiłem na ten problem. Podczas zapisywania jednego z moich modeli pojawia się komunikat o błędzie: "Ten wiersz został oznaczony jako tylko do odczytu". Nie wiem, dlaczego otrzymuję ten błąd i jak go rozwiązać. Ślad stosu mi nie pomógł. Jak mogę rozwiązać ten problem, aby móc zapisać rekord?Zend Framework: Ten wiersz został oznaczony jako tylko do odczytu

+0

Czy rekord został pobrany jako część zapytania, które używało sprzężenia, czy też wybrano wyłączenie flagi setIntegrityCheck? – drew010

+0

prawdopodobnie ... dlaczego pytasz? Czy nie mogę dołączyć do innych danych w modelu, jeśli zamierzam go później zapisać? – Andrew

+2

Jeśli tak, to zwracany obiekt wiersza zostanie oznaczony jako tylko do odczytu, ponieważ sprawdzanie integralności jest wyłączone i nie gwarantuje, że obiekt jest zgodny z obiektem tabeli, więc nie można go bezpośrednio zaktualizować, musisz utworzyć nowy obiekt klasy wiersza i skopiować do niego dane. – drew010

Odpowiedz

7

Po wiersz oznaczony jako tylko do odczytu może być wynikiem z jednej z następujących operacji:

  • Zapytanie Zend_Db_Select połączone z innej tabeli
  • setIntegrityCheck(false) został ustawiony na zaznaczonym obiekcie
  • Jeden lub więcej kolumn jest wynikiem wycenionego wyrażenia

Jeśli którykolwiek z powyższych warunków jest prawdziwy, to wynikowy obiekt wiersza będzie miał rked jako tylko do odczytu, ponieważ Zend_Db nie może zagwarantować, że wszystkie kolumny w wynikach odwołują się do oryginalnej tabeli nadrzędnej wybranego obiektu. Dlatego każda próba wywołania update(), save() lub na obiekcie wiersza zakończy się niepowodzeniem.

Niektóre z tych informacji są dostępne w całym numerze Zend_Db_Table reference, gdzie w przypadku wyszukiwania integrity można zobaczyć liczbę wystąpień, w których wiersze będą oznaczone jako tylko do odczytu.

+0

możliwe literówka - Wierzę, że 'setIntegrityCheck (TRUE)' jest to, co masz na myśli, ponieważ zwykle ustawiamy ją na "FALSE", aby umożliwić połączenia. Chociaż mógłbym cofnąć kontekst. – RockyFord

+0

To prawda, jeśli wyłączysz sprawdzanie integralności 'setIntegrityCheck (false)', wtedy wiersz jest oznaczony jako tylko do odczytu. Jeśli sprawdzanie integralności jest włączone i przechodzi, wtedy wiersz jest zmienny. – drew010

+0

Dziękuję, że miałem to w głowie. – RockyFord