[LARAVEL] selectRaw() in Eloquent update

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • Groax
  • Registratie: Oktober 2012
  • Laatst online: 18-08 11:58
Mijn vraag

Ik moet voor mijn werk images opslaan in de DB. Dit doen wij met goede redenen ;)
doordat ik dit doe door middel van Laravel en het liefst met Eloquent graag jullie hulp :)


Relevante software en hardware die ik gebruik

Wij werken met MSSQL

Wat ik al gevonden of geprobeerd heb

dit komt van de Laravel site zelf.
code:
1
2
3
$orders = DB::table('orders')
    ->selectRaw(*string*)
    ->get();


Maar dit is voor get() en de update() wilt een array.. hoe kan ik selectRaw() in deze Array verwerken? en wat is de juiste CONVERT SQL query hiervoor?

Wat ik probeer is:

code:
1
2
$client = Client::findOrFail($id);
$client->update($request->all());


De Error:

code:
1
2
3
4
5
SQLSTATE[42000]: [Microsoft][ODBC Driver 13 for SQL Server]
[SQL Server]Implicit conversion from data type nvarchar to varbinary(max) is not allowed.
 Use the CONVERT function to run this query.
 (SQL: update [client] set [logo] = C:\xampp\tmp\phpC80A.tmp,
 [modified_at] = 2018-05-04 14:36:51.287 where [ID] = 1)


Bij Voorbaat dank!!

Edit:
Kan een mod mijn titel veranderen in [LARAVEL] selectRaw() in Eloquent update

[ Voor 4% gewijzigd door Groax op 04-05-2018 16:55 . Reden: Titel vergeten... ]

Beste antwoord (via Groax op 14-05-2018 11:11)


  • DJMaze
  • Registratie: Juni 2002
  • Niet online
Je kan de binaire data ook eerst base64 encoden (33% overhead).
Binaire data in de database is namelijk geen kattenpis. (<= ik bedoel hier mee in PHP, zie posts hieronder)

[ Voor 31% gewijzigd door DJMaze op 14-05-2018 15:19 ]

Maak je niet druk, dat doet de compressor maar

Alle reacties


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
Je kan de binaire data ook eerst base64 encoden (33% overhead).
Binaire data in de database is namelijk geen kattenpis. (<= ik bedoel hier mee in PHP, zie posts hieronder)

[ Voor 31% gewijzigd door DJMaze op 14-05-2018 15:19 ]

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • Groax
  • Registratie: Oktober 2012
  • Laatst online: 18-08 11:58
Opgelost:

code:
1
2
3
4
5
6
7
8
9
10
11
12
$client = Client::findOrFail($id);
        $client->update([
            'name'=>$request->name,
            'description'=>$request->description
        ]);

        if ($request->hasFile('logo')) {
            if($request->file('logo')->isValid()) {
                $image = base64_encode(file_get_contents($request->file('logo')));
                DB::update("update client set logo = CONVERT(VARBINARY(max),'{$image}') where ID = ?", [$client->ID]);
            }
        }

Acties:
  • +2 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
DJMaze schreef op vrijdag 4 mei 2018 @ 18:05:
Binaire data in de database is namelijk geen kattenpis.
Data is data hoor. Het zijn allemaal bytes; of je nou tekst, getallen, datums of whatever opslaat. Base64 is dus overbodig en levert alléén maar overhead op (daarbij: je data wordt 33% groter; dat zou ik geen "kleine overhead" noemen). Het wordt een ander verhaal als je ORM of DB geen (var)binary/'blob' type o.i.d. ondersteunt en dan kan Base64 een workaround zijn. Maar elk zichzelf respecterend RDBMS kan "tegenwoordig" (sinds de 80's waarschijnlijk) prima "binaire data" opslaan.

[ Voor 7% gewijzigd door RobIII op 14-05-2018 13:44 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
RobIII schreef op maandag 14 mei 2018 @ 13:23:
Het wordt een ander verhaal als je ORM of DB geen (var)binary/'blob' type o.i.d. ondersteunt en dan kan Base64 een workaround zijn.
Gewoon dit dus.

Als je in PHP bijvoorbeeld PostgreSQL gebruikt dan moet je pg_escape_bytea() en pg_unescape_bytea() gebruiken.
Bij MySQL doe je: '0x'.bin2hex($data)
Bij SQL Server: überhaupt mogelijk? in PHP alleen via CONVERT(VARBINARY(MAX), ?) ?
PDO: http://php.net/manual/en/pdo.lobs.php

Als Laravel of whatever geen idee heeft dat de 'data' binaire is, en je dit ook niet kan aangeven heb je een probleem.

PHP kent dit type ook helemaal niet, die kent alleen "string".
In PHP 6 (nooit gereleased) kon het wel met de 'b' prefix: b"binaire data" en is_binary().

VARBINARY is soms best klein, en dan is een BLOB/BYTEA/etc. de standaard.

Ik zei het dus niet voor niks ;)

Maak je niet druk, dat doet de compressor maar


Acties:
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
DJMaze schreef op maandag 14 mei 2018 @ 13:51:
Gewoon dit dus.
[...]
Ik zei het dus niet voor niks ;)
Ik reageerde dan ook op je "geen kattenpis". Dat PHP/laravel/whatver toevallig niet precies dat scenario niet ondersteunt maakt 't niet opeens "bijzonder" om binaire data in je DB te hebben; ik snapte heel dat "geen kattenpis" gewoon niet. Want het is dus... wél kattenpis(?) :P

[ Voor 4% gewijzigd door RobIII op 14-05-2018 13:54 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
@RobIII je mag ook "Dat is geen klein bier" zeggen hoor :)

Maak je niet druk, dat doet de compressor maar


Acties:
  • +1 Henk 'm!

  • winkbrace
  • Registratie: Augustus 2008
  • Laatst online: 24-08 15:17
Ter aanvulling: Als je het echt Laravel-ish wilt oplossen, kun je de castAttribute en setAttribute methodes overschrijven in je Model. Daarin kun je dan de mapping maken en volstaat een $order->save();

PHP:
1
2
3
4
5
6
7
8
9
10
    public function setAttribute($key, $value)
    {
        if ($key == 'image') {
            $value = base64_encode($value);
        }

        return parent::setAttribute($key, $value);
    }

    // en castAttribute voor reverse
Pagina: 1