Doctrine Project

  • Log In Access more options
    • Online Help
    • Keyboard Shortcuts
    • About JIRA
    • JIRA Credits
    • What’s New
  • Dashboards Access more options (Alt+d)
  • Projects Access more options (Alt+p)
  • Issues Access more options (Alt+i)
Doctrine 2 - ORM
  • Doctrine 2 - ORM
  • DDC-1048

Boolean type issue

  • Log In
  • Views
    • XML
    • Word
    • Printable

Details

  • Type: Bug Bug
  • Status: Closed Closed
  • Priority: Minor Minor
  • Resolution: Cannot Reproduce
  • Affects Version/s: 2.0
  • Fix Version/s: None
  • Component/s: Mapping Drivers, ORM
  • Security Level: All
  • Labels:
    None
  • Environment:
    MySQL, pdo_mysql, Symfony2

Description

I'm having issues working with Doctrine2 boolean type. My mapping is basic:

	/**
	 * @orm:Column(type="boolean", nullable=false, name="is_deleted")
	 */
	protected $isDeleted;

When I'm trying to flush the object with $isDeleted=false (or true), the entity is not being added to the db. However when I set $isDeleted='0' (or '1') everything works fine.

I saw plenty of examples where people were using true and false, instead of '0' and '1'. But with MySQL it doesn't work. Doctrine maps boolean field as TINYINT(1) in MySQL. And I can see in Symfony2 Profiler the parameter in the query is "false"/"true", so here is data type conflict.

Doctrine doesn't transform true/false to 1/0 values.

Issue Links

relates to

Bug - A problem which impairs or prevents the functions of the product. DDC-1394 Boolean literals in DQL queries get translated wrongly on PostgreSQL (PDOException)

  • Major - Major loss of function.
  • Resolved - A resolution has been taken, and it is awaiting verification by reporter. From here issues are either reopened, or are closed.

Activity

Ascending order - Click to sort in descending order
  • All
  • Comments
  • History
  • Activity
  • Source
Hide
Permalink
Benjamin Eberlei added a comment - 04/Mar/11 5:09 PM

Boolean works fine for me with MySQL since forever, i cannot reproduce this. Can you come up with a reproducable test-case in our Testsuite? Otherwise odds are pretty slim to fix this, as i need to see whats happening.

Show
Benjamin Eberlei added a comment - 04/Mar/11 5:09 PM Boolean works fine for me with MySQL since forever, i cannot reproduce this. Can you come up with a reproducable test-case in our Testsuite? Otherwise odds are pretty slim to fix this, as i need to see whats happening.
Hide
Permalink
Nikita Korotaev added a comment - 04/Mar/11 6:29 PM - edited

Sorry don't know how to use your Testsuite.

So basically what I have:

Symfony 2 PR6 standard sandbox with the following config:

doctrine:
   dbal:
       dbname:   shop
       user:     root
       password: ~
       logging:  %kernel.debug%
   orm:
       auto_generate_proxy_classes: %kernel.debug%
       mappings:
           HelloBundle: ~

Then I have simple entity:

<?php

namespace Sensio\HelloBundle\Entity;

/**
 * @orm:Entity()
 * @orm:Table(name="product")
 */
class Product
{
    /**
     * @orm:Id
     * @orm:GeneratedValue
     * @orm:Column(type="integer")
     */
    private $id;

    /** @orm:Column(type="text", nullable=false) */
    private $name;

    
    /** @orm:Column(type="boolean") */
    private $inStock;
    
    public function getId()
    {
        return $this->id;
    }

    public function setName($name)
    {
        $this->name = $name;
    }

    public function getName()
    {
        return $this->name;
    }

    public function setInStock($inStock)
    {
        $this->inStock = $inStock;
    }

    public function getInStock()
    {
        return $this->inStock;
    }
}

Run the following commands:

php app/console doctrine:database:create
php app/console doctrine:schema:create

And finally I have simple action in the HelloController:

<?php

namespace Sensio\HelloBundle\Controller;

use Sensio\HelloBundle\Entity\Product;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class HelloController extends Controller
{
    public function indexAction($name)
    {
         $product = new Product();
         $product->setName($name);
         $product->setInStock(true);
		
         $em = $this->get('doctrine.orm.default_entity_manager');
         $em->persist($product);
         $em->flush();

         return $this->render('HelloBundle:Hello:index.html.twig', array('name' => $name));

    }
}

Go to the http://localhost/web/app_dev.php/hello/Product1
—
When I set 'true' for inStock attribute, and then flush object to the DB, it doesn't create a row. However when I write $product->setInStock('1') - that's works and the row appears in the DB. And $product->setInStock(1) that's doen't work again. That's a very strange behaviour, and I couldn't explain it anyhow.

Show
Nikita Korotaev added a comment - 04/Mar/11 6:29 PM - edited Sorry don't know how to use your Testsuite. So basically what I have: Symfony 2 PR6 standard sandbox with the following config: doctrine: dbal: dbname: shop user: root password: ~ logging: %kernel.debug% orm: auto_generate_proxy_classes: %kernel.debug% mappings: HelloBundle: ~ Then I have simple entity: <?php namespace Sensio\HelloBundle\Entity; /** * @orm:Entity() * @orm:Table(name= "product" ) */ class Product { /** * @orm:Id * @orm:GeneratedValue * @orm:Column(type= "integer" ) */ private $id; /** @orm:Column(type= "text" , nullable= false ) */ private $name; /** @orm:Column(type= " boolean " ) */ private $inStock; public function getId() { return $ this ->id; } public function setName($name) { $ this ->name = $name; } public function getName() { return $ this ->name; } public function setInStock($inStock) { $ this ->inStock = $inStock; } public function getInStock() { return $ this ->inStock; } } Run the following commands: php app/console doctrine:database:create php app/console doctrine:schema:create And finally I have simple action in the HelloController: <?php namespace Sensio\HelloBundle\Controller; use Sensio\HelloBundle\Entity\Product; use Symfony\Bundle\FrameworkBundle\Controller\Controller; class HelloController extends Controller { public function indexAction($name) { $product = new Product(); $product->setName($name); $product->setInStock( true ); $em = $ this ->get('doctrine.orm.default_entity_manager'); $em->persist($product); $em->flush(); return $ this ->render('HelloBundle:Hello:index.html.twig', array('name' => $name)); } } Go to the http://localhost/web/app_dev.php/hello/Product1 — When I set 'true' for inStock attribute, and then flush object to the DB, it doesn't create a row. However when I write $product->setInStock('1') - that's works and the row appears in the DB. And $product->setInStock(1) that's doen't work again. That's a very strange behaviour, and I couldn't explain it anyhow.
Hide
Permalink
Benjamin Eberlei added a comment - 15/Oct/11 8:25 AM

This is pretty old. Do you still use boolean types and does it work? The code suggests you maybe used Doctrine 2.0.x back then, does this work with Doctrine 2.1.x for you?

Show
Benjamin Eberlei added a comment - 15/Oct/11 8:25 AM This is pretty old. Do you still use boolean types and does it work? The code suggests you maybe used Doctrine 2.0.x back then, does this work with Doctrine 2.1.x for you?
Hide
Permalink
Alexander added a comment - 08/Nov/11 10:11 PM

Lowered the priority of this issue until we receive more feedback.

Show
Alexander added a comment - 08/Nov/11 10:11 PM Lowered the priority of this issue until we receive more feedback.
Hide
Permalink
Alexander added a comment - 15/Mar/12 9:46 PM

Closing because we were unable to reproduce and no further feedback was provided.

Show
Alexander added a comment - 15/Mar/12 9:46 PM Closing because we were unable to reproduce and no further feedback was provided.
Hide
Permalink
Joseph Wynn added a comment - 13/May/12 5:33 PM

Hi guys, I was able to reproduce similar behaviour. Simply adding a boolean column to an entity prevents Doctrine from persisting new entities to the database. I am using a freshly-checked-out 2.2.2 with the Laravel PHP framework. Boolean columns have worked for me previously and I wondered whether Laravel's autoloaders were interfering with Doctrine somehow (just a stab in the dark).

Here is my Test entity:

<?php

namespace Entity;

/**
 * @Entity
 * @Table(name="test_entry")
 */
class Test
{

        /**
         * @Id
         * @Column(type="integer", nullable=false)
         * @GeneratedValue(strategy="AUTO")
         */
        protected $id;

        /**
         * @Column(type="string", length=40, nullable=false)
         */
        protected $string_col;

        public function getId()
        {
                return $this->id;
        }

        public function setStringCol($string_col)
        {
                $this->string_col = $string_col;
        }

        public function getStringCol()
        {
                return $this->string_col;
        }

}

Persisting a new Test entity like this works fine.

$test = new \Entity\Test;
$test->setStringCol('String value');
$em->persist($test);
$em->flush();

However, if I add a boolean column to the entity, the persist/flush operations seem to fail silently and the record is not inserted. The boolean column looks like this:

/**
 * @Column(type="boolean", nullable=false)
 */
protected $bool_col = false;
Show
Joseph Wynn added a comment - 13/May/12 5:33 PM Hi guys, I was able to reproduce similar behaviour. Simply adding a boolean column to an entity prevents Doctrine from persisting new entities to the database. I am using a freshly-checked-out 2.2.2 with the Laravel PHP framework. Boolean columns have worked for me previously and I wondered whether Laravel's autoloaders were interfering with Doctrine somehow (just a stab in the dark). Here is my Test entity: <?php namespace Entity; /** * @Entity * @Table(name= "test_entry" ) */ class Test { /** * @Id * @Column(type= "integer" , nullable= false ) * @GeneratedValue(strategy= "AUTO" ) */ protected $id; /** * @Column(type= "string" , length=40, nullable= false ) */ protected $string_col; public function getId() { return $ this ->id; } public function setStringCol($string_col) { $ this ->string_col = $string_col; } public function getStringCol() { return $ this ->string_col; } } Persisting a new Test entity like this works fine. $test = new \Entity\Test; $test->setStringCol(' String value'); $em->persist($test); $em->flush(); However, if I add a boolean column to the entity, the persist/flush operations seem to fail silently and the record is not inserted. The boolean column looks like this: /** * @Column(type= " boolean " , nullable= false ) */ protected $bool_col = false ;
Hide
Permalink
Joseph Wynn added a comment - 13/May/12 5:35 PM

Sorry, forgot to say that explicitly setting the value of bool_col doesn't make a difference. I have also tried setting the value to (int) 1 or 0, with the same results.

Show
Joseph Wynn added a comment - 13/May/12 5:35 PM Sorry, forgot to say that explicitly setting the value of bool_col doesn't make a difference. I have also tried setting the value to (int) 1 or 0, with the same results.
Hide
Permalink
Tõnis Tobre added a comment - 29/May/12 11:40 AM

My development environment is Ubuntu Linux, these boolean types is working well. After new developer put project up on his Windows 7 WAMP machine exactly the same problem happened.
Firstly thought that MySQL is acting differently, but no, we connected MySQL to Linux server, still same problem. The solution was to replace boolean types to integers.

So perhaps you couldn't reproduce it because you tested it in Linux. You should run the same test on the Windows machine.

Show
Tõnis Tobre added a comment - 29/May/12 11:40 AM My development environment is Ubuntu Linux, these boolean types is working well. After new developer put project up on his Windows 7 WAMP machine exactly the same problem happened. Firstly thought that MySQL is acting differently, but no, we connected MySQL to Linux server, still same problem. The solution was to replace boolean types to integers. So perhaps you couldn't reproduce it because you tested it in Linux. You should run the same test on the Windows machine.
Hide
Permalink
Piotr Jura added a comment - 20/Dec/12 11:26 AM

Run into same problem here with Doctrine 2.3.x and MySQL 5.5.16 running on Windows 7 with Symfony2. Using query builder:

Unable to find source-code formatter for language: php. Available languages are: actionscript, html, java, javascript, none, sql, xhtml, xml
->where($qb->expr()->eq('c.private', 'false'))

I have to use literal 'false' or 0.

Show
Piotr Jura added a comment - 20/Dec/12 11:26 AM Run into same problem here with Doctrine 2.3.x and MySQL 5.5.16 running on Windows 7 with Symfony2. Using query builder: Unable to find source-code formatter for language: php. Available languages are: actionscript, html, java, javascript, none, sql, xhtml, xml ->where($qb->expr()->eq('c. private ', ' false ')) I have to use literal 'false' or 0.
Hide
Permalink
Luis Cordova added a comment - 05/Apr/13 5:55 AM

@beberlei @ocramius this should be reopened it is a present bug on 2.3+, i had the same problem rolled back and it works again.

Show
Luis Cordova added a comment - 05/Apr/13 5:55 AM @beberlei @ocramius this should be reopened it is a present bug on 2.3+, i had the same problem rolled back and it works again.
Hide
Permalink
Marco Pivetta added a comment - 05/Apr/13 7:52 AM

Won't reopen without failing test case

Show
Marco Pivetta added a comment - 05/Apr/13 7:52 AM Won't reopen without failing test case
Hide
Permalink
Luis Cordova added a comment - 10/Apr/13 3:36 AM

https://github.com/doctrine/doctrine2/pull/647

Show
Luis Cordova added a comment - 10/Apr/13 3:36 AM https://github.com/doctrine/doctrine2/pull/647
Hide
Permalink
Marco Pivetta added a comment - 12/Apr/13 1:10 AM

Luis Cordova your test is not related with this issue :\

Show
Marco Pivetta added a comment - 12/Apr/13 1:10 AM Luis Cordova your test is not related with this issue :\

People

  • Assignee:
    Benjamin Eberlei
    Reporter:
    Nikita Korotaev
Vote (0)
Watch (4)

Dates

  • Created:
    27/Feb/11 11:32 AM
    Updated:
    12/Apr/13 1:10 AM
    Resolved:
    15/Mar/12 9:46 PM
  • Atlassian JIRA (v5.2.7#850-sha1:b2af0c8)
  • Report a problem
  • Powered by a free Atlassian JIRA open source license for Doctrine Project. Try JIRA - bug tracking software for your team.