Как сохранить все значения первого массива, возвращенного firebase, в php - PullRequest
1 голос
/ 22 февраля 2020

Предположим, у меня есть данные в db user

{
  "signup_login" : {
    "2315218123" : {
      "name" : "yohan",
    },
    "2665451854" : {
      "name" : "Ram",
    },
    "5453698463" : {
      "name" : "Raj",
    }
  }
}

, так как я попробовал этот фрагмент кода, чтобы получить данные signup_login в базе данных user

class lol  {
    protected $database;
    protected $dbname = 'signup_login';

    public function __construct(){
        $acc = ServiceAccount::fromJsonFile(__DIR__ . '/secret/user-key.json');
        $firebase = (new Factory)->withServiceAccount($acc)->create();

        $this->database = $firebase->getDatabase();
    }

    public function get(){

        if ($this->database->getReference($this->dbname)->getSnapshot()){
            return $this->database->getReference($this->dbname)->getValue();
        } else {
            return FALSE;
        }
    }
}

$users = new lol();
var_dump($users->get());

, поскольку я хочу хранить данные в виде массива, например

$data = ["2315218123","2665451854","5453698463"]

, но код, написанный выше, возвращает это как вывод, как его право, но я хотел бы сохранить его в виде массива, упомянутого выше, но я не могу это сделать ..

array(3) {
  [2315218123]=>
  array(1) {
    ["name"]=>
    string(5) "yohan"
  }
  [2665451854]=>
  array(1) {
    ["name"]=>
    string(3) "Ram"
  }
  [5453698463]=>
  array(1) {
    ["name"]=>
    string(3) "Raj"
  }
 }

1 Ответ

1 голос
/ 22 февраля 2020

Следуя вашему примеру, вы можете получить идентификаторы с array_keys():

$lol = new lol();
$userIds = array_keys($users->get());
var_dump($userIds);

PHP преобразует целочисленные строки в целые при использовании массивов, поэтому вам придется преобразовать значения для последующего ввода:

$userIds = array_map('strval', $userIds);

Некоторые примечания:

Вы, очевидно, используете Firebase Admin SDK для PHP, но с методами, которые были устарел с давних пор. Я хотел бы предложить вам обновить до последней версии (4.40 на момент написания этой статьи) и следовать документации на https://firebase-php.readthedocs.io/.

Вместо записи

$acc = ServiceAccount::fromJsonFile(__DIR__ . '/secret/user-key.json');
$firebase = (new Factory)->withServiceAccount($acc)->create();
$database = $firebase->getDatabase();

вы должны использовать

$acc = __DIR__ . '/secret/user-key.json';
$factory = (new Factory)->withServiceAccount($acc);
$database = $factory->createDatabase();

В вашем примере вы звоните getSnapshot() и getValue() отдельно - обратите внимание, что это вызовет два отдельных вызова API Firebase (Database::getValue() просто удобное сочетание клавиш для Database::getSnapshot()->getValue())

Более эффективный способ получения ключей, на которые вы ссылаетесь, состоит в использовании метода Reference::getChildKeys().

В свете всего этого я бы Я хотел бы предложить переписать ваш класс lol примерно так:

class LolWut
{
    /** @var \Kreait\Firebase\Database\Reference */
    private $ref;

    public function __construct($refName = 'signup_login')
    {
        $this->ref = (new Factory())
            ->withServiceAccount(__DIR__ . '/secret/user-key.json')
            ->createDatabase()
            ->getReference($refName); // Does not invoke a call to the Firebase APIs
    }

    public function getUsers()
    {
        return $this->ref->getSnapshot()->getValue();
    }

    /**
     * @return string[]
     */
    public function getUserIds(): array
    {
        return array_map('strval', $this->ref->getChildKeys());
    }
}

Было бы также неплохо создать экземпляр фабрики вне вашего класса и передать только тому, что вам нужно внутри это работает.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...