Domanda

Sto cercando di restituire una singola riga da una tabella in base alla chiave primaria.

    $product = Product::where('id', '=', $idOrSKU)
        ->orWhere('sku', '=', $idOrSKU)
        ->take(1)->get();
.

Per qualche motivo $idorSKU viene convertito in e (int) prima che accada il confronto.Ad esempio, quando $isOrSKU = "9dfghfd", la riga con ID= 9 viene restituita.Perchè è questo?Non dovrebbe restituire nulla!Qualcuno può spiegare questo?

Ecco lo schema di tabella pertinente

| id                         | int(10) unsigned | NO   | PRI | NULL      
| name                       | varchar(255)     | NO   |     | NULL                
| sku                        | varchar(255)     | NO   |     | NULL 
.

È stato utile?

Soluzione

Questo è legato al database, non la laravel, digitando la stringa. Poiché stai facendo una query su una colonna int(10), mySQL stabilmente modificando la tua stringa di ricerca su un int, causando la tua query di diventare 9.

Posso confermare quanto segue:

$test1 = Test::find('1');
echo $test1->id; // gives 1

$test2 = Test::find('1example');
echo $test2->id; // gives 1
.

Pertanto la tua variabile di 9dfghfd perché typecast a int (9). Ma se la tua variabile era "DF9GHFD" - non sarebbe Typecast e non corrisponderebbe.

Modifica: il problema influisce su altre cose, come il modello di rotta vincolante:

domain.com/product/1

domain.com/product/1thisalsoworks // takes you to the page of ID 1
.

Ho aperto un biglietto su Github per discuterne ulteriormente - quindi controlla qui Per ulteriori informazioni / discussioni.

Ma nel complesso il problema non è un errore diretto di Laravel.

Modifica: sembra che il problema colpisca GitHub stesso :

Queste opere: https://github.com/laravel/framework/issues/5254

E così questo: https://github.com/laravel/framework/issues/5254typecast

Altri suggerimenti

Risulta che qui, usando PostgreSQL, funziona diversamente dal database, quando faccio:

Route::any('test', function()
{
    $code = '181rerum';

    return Ad::where('id', $code)->orWhere('company_code', $code)->first();
});
.

Ottengo questo errore:

SQLSTATE[22P02]: Invalid text representation: 7 ERROR: invalid input 
syntax for integer: "181rerum" (SQL: select * from "ads" where 
"id" = 181rerum or "company_code" = 181rerum limit 1)
.

SO LA LARAVEL, sapendo che è una colonna Integer, lo passa direttamente al database senza preventivi, che genera un'eccezione del database, poiché PostgreSQL non tenterà nemmeno di lanciare questa stringa su numero intero.

Allora, anche se ricevi un aiuto da parte degli sviluppatori di Laravel Core, penso che dovresti sempre fare qualcosa del genere per aiutarti a fare quelle seches misti:

Route::any('test/{id}', function($id)
{
    /// You can always filter by a string here

    $q = Ad::where('company_code', $id);

    /// You just try to filter by id if the search string is entirely numeric

    if (is_numeric($id))
    {
        $q->orWhere('id', $id);
    }

    return $q->first();
});
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top