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
Odpowiedz
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.
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
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
Dziękuję, że miałem to w głowie. – RockyFord
Czy rekord został pobrany jako część zapytania, które używało sprzężenia, czy też wybrano wyłączenie flagi setIntegrityCheck? – drew010
prawdopodobnie ... dlaczego pytasz? Czy nie mogę dołączyć do innych danych w modelu, jeśli zamierzam go później zapisać? – Andrew
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