Frage

Ich versuche, ein MySQL-Bit-Feld in meinem Katalysator App zuzugreifen. Hier ist die Tabelle Info:

SQL:

create table foo{
 ...
 mybitField bit(1) NOT NULL default b'0'
}

Meine abgebildete Tabelle:

...

mybitField
{
    data_type => "BIT",
    default_value => "b'0'",
    is_nullable => 0,
    size => undef,
  }
...

Jetzt in meinem Controller, kann ich eine einfache

$c->stash->{foos}=[$c->model('DB::foo')->all];

und in meiner Vorlage, habe ich versucht, die folgenden:

[% FOREACH foo IN foos -%]
  <tr>
      [%- IF int(foo.mybitField) %]
                <td>The field is True</td>
        [%- ELSE %]
                <td>The field is False</td>
        [% END %]
  </tr>
[% END -%]

Ich habe auch versucht, nur

[%- IF foo.mybitField %]

, aber das hat nicht funktioniert. Jede andere Art und Weise außer Ändern des Datenbank-Feldtypen selbst?

War es hilfreich?

Lösung

ich das gerade getestet und MySQL BIT Felder wieder als der „rohe“ binäre Wert, wie erwartet. So scheint es, was Sie haben ein Template Toolkit Problem ist.

Ich weiß nicht, was Sie unter:

[%- IF int(foo.mybitField) %]

Ich glaube nicht, TT eine int () Funktion. Und Perl int () Funktion würde das nicht tun, was Sie wollen, auch nicht. Mein Vorschlag wäre, entweder eine Funktion in Perl zu schreiben, die den gepackten Wert in eine reguläre ganzen Zahl konvertiert, zum Beispiel:

my $int = unpack( 'c', $bit_field );

Eine Alternative wäre eine Spalte Inflation Spalte zu Ihrem Schema Klassen hinzuzufügen.

__PACKAGE__->inflate_column('mybitField', {
    inflate => sub { unpack( 'c*', shift ) },
});

Dies würde jedoch nach wie vor noch nach Updates nicht und ich weiß nicht, eine einfach Lösung dafür. Ich habe selber nie die BIT-Daten mich auf MySQL geben. - Ich in der Regel ein CHAR (1) Spalte

Auch könnte man bessere Antworten bekommen, wenn Sie auf der DBIC Mailingliste fragen bei dbix-class@lists.scsys.co.uk oder an dem # DBIx-Klasse-Kanal auf irc.perl.org.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top