2017-10-20 23 views
0

J'utilise Laravel et j'ai besoin de passer un tableau associatif à une fonction statique dans un modèle éloquent.Passer un tableau à la méthode statique du modèle éloquent

class MyClass extends Eloquent\Model 
{ 
    static function scopeRegister($input) { 
     return $input['key1']; 
    } 
} 

Courir avec Tinker, voici mon entrée:

$input = array('key1'=>'value', 'key2'=>'value', 'key3'=> 'value', 'key4'=>'value'); 

Quand je l'essayer, cependant, je reçois une erreur:

PHP error: Cannot use object of type Illuminate\Database\Eloquent\Builder as array

Et quand je tape-indication tableau:

class MyClass extends Eloquent\Model 
{ 
    static function scopeRegister(array $input) { 
     return $input['key1']; 
    } 
} 

Je reçois l'erreur suivante :

Argument 1 passed to App\KeywordGeotarget::scopeRegister() must be of the type array, object given

Que se passe-t-il ici et comment puis-je accéder aux valeurs définies dans le tableau à partir de la méthode statique dans le modèle?


EDIT: Je suis juste en utilisant Tinker en ce moment pour tester cela, mais est ici le code que je utilise pour appeler la méthode:

php artisan tinker 
>> $input = array('key1'=>'value','key2'=>'value','key3'=>'value', 'key4'=>'value'); 
>> App\MyClass::register($input); 
+0

pouvez-vous nous montrer où (le code) vous appelez la méthode statique? – Yes92

+0

plz ajoutez le code dans lequel vous appelez la fonction. –

+0

Merci d'avoir lu la question. J'ai mis à jour la question et ajouté le code dans lequel j'appelle la fonction. – LeviJames

Répondre

1

Vous définissez une portée éloquente. Les étendues ne fonctionnent pas avec les tableaux, mais avec les requêtes.

Vous pouvez en savoir plus sur la façon de déclarer et de champs d'utilisation ici https://laravel.com/docs/5.5/eloquent#local-scopes

Si vous voulez appeler register() comme vous l'avez fait dans l'exemple de bricoler, faire cela à la place (il suffit de supprimer le champ d'application):

class MyClass extends Eloquent\Model 
{ 
    static function register(array $input) { 
     return $input['key1']; 
    } 
} 
+0

Merci pour votre réponse!J'ai enlevé la portée et ça marche. Pour une raison quelconque, je pensais que je devais utiliser une portée afin d'utiliser une méthode statique:/Marquer cela comme la bonne réponse en raison du lien vers la documentation. Merci encore! – LeviJames

1

Depuis sa portée, vous devez ajouter un $query comme premier paramètre, puis faire quelque chose comme ceci:

static function scopeRegister($query, array $input) 
{ 
    return $query->where($input['key1']); 
} 

Si vous voulez juste avoir une méthode et vous ne voulez pas l'utiliser comme une portée locale, juste renommer la méthode (supprimer scope partie):

static function register(array $input) 
+0

Merci pour votre réponse! J'ai enlevé la portée et ça marche. Pour une raison quelconque, je pensais que je devais utiliser une portée pour utiliser une méthode statique:/ – LeviJames

1

Votre compréhension de l'ajout de la portée de la requête est fausse Je suppose que vous devez passer par la documentation je pense. Check it over here. Les étendues représentent les propriétés du générateur de requête et vous ne pouvez pas obtenir les propriétés de la classe de générateur en tant que tableau. Vous devriez l'utiliser comme ça.

class MyClass extends Eloquent\Model 
{ 
    public function scopeRegister($query) { 

     return $query->where(// perform your where here); 

    } 
} 
+1

Merci d'avoir pris le temps de répondre à ma question et de montrer l'utilisation correcte. – LeviJames