content = NULL; //can we store a NULL? asrt( is_null( $book->content ), TRUE ); R::store( $book ); //did we really store the NULL value ? $book = R::findOne( 'book', ' content IS NULL ' ); asrt( ( $book instanceof OODBBean ), TRUE ); //still NULL, not empty STRING ? asrt( is_null( $book->content ), TRUE ); $book->pages = 100; R::store( $book ); //did we save it once again as NULL? $book = R::findOne( 'book', ' content IS NULL ' ); asrt( ( $book instanceof OODBBean ), TRUE ); asrt( is_null( $book->content ), TRUE ); asrt( gettype( $book->pages ), 'string' ); $otherBook = R::dispense( 'book' ); $otherBook->pages = 99; //also if the column is VARCHAR-like? $otherBook->content = 'blah blah'; R::store( $otherBook ); $book = R::findOne( 'book', ' content IS NULL ' ); asrt( ( $book instanceof OODBBean ), TRUE ); asrt( is_null( $book->content ), TRUE ); asrt( intval( $book->pages ), 100 ); //can we query not NULL as well? $book = R::findOne( 'book', ' content IS NOT NULL ' ); asrt( ( $book instanceof OODBBean ), TRUE ); asrt( is_null( $book->content ), FALSE ); asrt( intval( $book->pages ), 99 ); asrt( $book->content, 'blah blah' ); //Can we bind NULL directly? $book->isGood = FALSE; //Is NULL the default? And... no confusion with boolean FALSE? R::store( $book ); $book = R::findOne( 'book', ' is_good IS NULL' ); asrt( ( $book instanceof OODBBean ), TRUE ); asrt( is_null( $book->content ), TRUE ); asrt( intval( $book->pages ), 100 ); $book = R::findOne( 'book', ' is_good = ?', array( 0 ) ); asrt( ( $book instanceof OODBBean ), TRUE ); asrt( is_null( $book->content ), FALSE ); asrt( intval( $book->pages ), 99 ); } /** * Tests whether we can NULLify a parent bean * page->book if the parent (book) is already * NULL. (isset vs array_key_exists bug). * * @return void */ public function testUnsetParent() { R::nuke(); $book = R::dispense( 'book' ); $book->title = 'My Book'; $page = R::dispense( 'page' ); $page->text = 'Lorem Ipsum'; $book->ownPage[] = $page; R::store( $book ); $page = $page->fresh(); R::freeze( TRUE ); asrt( (int) $page->book->id, (int) $book->id ); unset( $page->book ); R::store( $page ); $page = $page->fresh(); asrt( (int) $page->book->id, (int) $book->id ); $page->book = NULL; R::store( $page ); $page = $page->fresh(); asrt( $page->book, NULL ); asrt( $page->book_id, NULL ); asrt( $page->bookID, NULL ); asrt( $page->bookId, NULL ); $page = R::dispense( 'page' ); $page->text = 'Another Page'; $page->book = NULL; try { R::store( $page ); fail(); } catch( \Exception $exception ) { pass(); } unset($page->book); R::store($page); $page = $page->fresh(); $page->book = NULL; //this must set field id to NULL not ADD column! try { R::store($page); pass(); } catch( \Exception $exception ) { fail(); } $page = $page->fresh(); $page->book = NULL; R::store( $page ); $page = $page->fresh(); asrt( is_null( $page->book_id ), TRUE ); $page->book = $book; R::store( $page ); $page = $page->fresh(); asrt( (int) $page->book->id, (int) $book->id ); $page->book = NULL; R::store( $page ); asrt( is_null( $page->book_id ), TRUE ); asrt( is_null( $page->book ), TRUE ); R::freeze( FALSE ); } /** * Test nullifying aliased parent. * * @return void */ public function testUnsetAliasedParent() { R::nuke(); $book = R::dispense( 'book' ); $author = R::dispense( 'author' ); $book->coauthor = $author; R::store( $book ); $book = $book->fresh(); asrt( is_null( $book->fetchAs('author')->coauthor ), FALSE ); unset( $book->coauthor ); R::store( $book ); $book = $book->fresh(); asrt( is_null( $book->fetchAs('author')->coauthor ), FALSE ); $book->coauthor = NULL; R::store( $book ); $book = $book->fresh(); asrt( is_null( $book->fetchAs('author')->coauthor ), TRUE ); R::trash( $book ); R::trash( $author ); R::freeze( TRUE ); $book = R::dispense( 'book' ); $author = R::dispense( 'author' ); $book->coauthor = $author; R::store( $book ); $book = $book->fresh(); asrt( is_null( $book->fetchAs('author')->coauthor ), FALSE ); unset( $book->coauthor ); R::store( $book ); $book = $book->fresh(); asrt( is_null( $book->fetchAs('author')->coauthor ), FALSE ); $book->coauthor = NULL; R::store( $book ); $book = $book->fresh(); asrt( is_null( $book->fetchAs('author')->coauthor ), TRUE ); R::trash( $book ); R::trash( $author ); R::freeze( FALSE ); } /** * Test NULL handling, setting a property to NULL must * cause a change. * * @return void */ public function testBasicNullHandling() { // NULL can change bean $bean = R::dispense( 'bean' ); $bean->bla = 'a'; R::store( $bean ); $bean = $bean->fresh(); asrt( $bean->hasChanged( 'bla' ), FALSE ); $bean->bla = NULL; asrt( $bean->hasChanged( 'bla' ), TRUE ); // NULL test $page = R::dispense( 'page' ); $book = R::dispense( 'book' ); $page->title = 'a NULL page'; $page->book = $book; $book->title = 'Why NUll is painful..'; R::store( $page ); $bookid = $page->book->id; unset( $page->book ); $id = R::store( $page ); $page = R::load( 'page', $id ); $page->title = 'another title'; R::store( $page ); pass(); $page = R::load( 'page', $id ); $page->title = 'another title'; $page->book_id = NULL; R::store( $page ); pass(); } /** * Here we test whether the column type is set correctly. * Normally if you store NULL, the smallest type (bool/set) will * be selected. However in case of a foreign key type INT should * be selected because fks columns require matching types. * * @return void */ public function ColumnType() { $book = R::dispense( 'book' ); $page = R::dispense( 'page' ); $book->ownPage[] = $page; R::store( $book ); pass(); asrt( $page->getMeta( 'cast.book_id' ), 'id' ); } /** * Test meta column type. * * @return void */ public function TypeColumn() { $book = R::dispense( 'book' ); $page = R::dispense( 'page' ); $page->book = $book; R::store( $page ); pass(); asrt( $page->getMeta( 'cast.book_id' ), 'id' ); } }