Jump to:

3372 Posts in 998 Topics by 712 members

Data Model Questions

SilverStripe Forums » Data Model Questions » How make MySQL BigInt class

Moderators: martimiz, Sean, biapar, Willr, Ingo, swaiba, simon_w

Page: 1
Go to End
Author Topic: 1133 Views
  • imsas
    Avatar
    Community Member
    22 Posts

    How make MySQL BigInt class Link to this post

    Hi all,

    I was working with facebook apps and sapphire and normal Int field out of space.

    Question how make ID type bigint auto increament.

    I traced mysqldatabyse class added new function

    public function bigint($values){
          //For reference, this is what typically gets passed to this function:
          //$parts=Array('datatype'=>'int', 'precision'=>11, 'null'=>'not null', 'default'=>(int)$this->default);
          //DB::requireField($this->tableName, $this->name, "int(11) not null default '{$this->defaultVal}'");

          return 'bigint(26) not null auto_increment';
       }

    and created bigint class

    class BigInt extends DBField {

       function __construct($name, $defaultVal = 0) {
          $this->defaultVal = is_int($defaultVal) ? $defaultVal : 0;
          
          parent::__construct($name);
       }

       /**
        * Returns the number, with commas added as appropriate, eg “1,000”.
        */
       function Formatted() {
          return number_format($this->value);
       }

       function nullValue() {
          return "0";
       }

       function requireField() {
          $parts=Array('datatype'=>'bigint', 'precision'=>26, 'null'=>'not null', 'default'=>$this->defaultVal, 'arrayValue'=>$this->arrayValue);
          $values=Array('type'=>'bigint', 'parts'=>$parts);
          DB::requireField($this->tableName, $this->name, $values);
       }

       function Times() {
          $output = new DataObjectSet();
          for( $i = 0; $i < $this->value; $i++ )
             $output->push( new ArrayData( array( 'Number' => $i + 1 ) ) );

          return $output;
       }

       function Nice() {
          return sprintf( '%d', $this->value );
       }
       
       public function scaffoldFormField($title = null, $params = null) {
          return new NumericField($this->name, $title);
       }
       
       /**
        * Return an encoding of the given value suitable for inclusion in a SQL statement.
        * If necessary, this should include quotes.
        */
       function prepValueForDB($value) {
          if($value === true) {
             return 1;
          } if(!$value || !is_numeric($value)) {
             if(strpos($value, '[')===false)
                return '0';
             else
                return addslashes($value);
          } else {
             return addslashes($value);
          }
       }
       
    }

    But problem is when i run DB build in dataobject overloading ID => 'BigInt' its goes some complicated.

    Maybe some had intructions?

    P.S. sorry for my English.

  • imsas
    Avatar
    Community Member
    22 Posts

    Re: How make MySQL BigInt class Link to this post

    I am using SS 2.4.3

  • Hamish
    Avatar
    Community Member
    712 Posts

    Re: How make MySQL BigInt class Link to this post

    It is probably not a good idea to try to hack around with the ID field.

    Any particular reason you can't just create a new field? Then you could just use a text field, or your custom BIGINT.

  • imsas
    Avatar
    Community Member
    22 Posts

    Re: How make MySQL BigInt class Link to this post

    Its not secret I wanna extend Dataobject Member Class, Like Player, and use Facebook users ID, save like member table ID.

    I was buld how I sad "mysqlDatabese" class changes its works, but not allways as I think. Some times when building (dev/build) DB , Its randomly Alter tables ID types from bitint (I made self) and default INT (11) And backward.

    I dont understand DB compilling algorythm (need more research).
    I feel its problem somever when I overload member ID and Player ID to big int...

  • Bambii7
    Avatar
    Community Member
    254 Posts

    Re: How make MySQL BigInt class Link to this post

    Yeah dam, I'm jsut going through the same issue. Will opt to use Varchar for the meantime. A bigint option would be nicer.

    Just a point about Bigint and Facebook id's, Bigint's by themselves are 63 bit, they need to be UNSIGNED to match Facebook's 64 bit ID's.

    1133 Views
Page: 1
Go to Top

Want to know more about the company that brought you SilverStripe? Then check out SilverStripe.com

Comments on this website? Please give feedback.