Может ли свойство объекта PHP быть массивом? И если да, то как мне добавить к нему из объекта?

#php #mysql #arrays #database #object

#php #mysql #массивы #База данных #объект

Вопрос:

У меня есть объект для представления комбинации данных из трех таблиц, я пытаюсь сделать этот объект как можно более универсальным, чтобы изменения в структуре БД не отражались в объекте и позволяли объекту редактировать 3 таблицы по отдельности вместо того, чтобы делать длинные сложные операторы соединения SQL.

Поскольку объект представляет таблицу базы данных, общедоступные свойства необходимы / приемлемы, и я пытаюсь динамически генерировать их в конструкторе, но сохраняя свойства отдельно для разных таблиц базы данных, в которых содержится информация. (Чтобы, когда я иду обновлять одну таблицу, информация, которая должна быть проверена на наличие изменений, а затем отправлена на обновление, не смешивалась со свойствами из других таблиц)

Моей первой идеей было сохранить каждую таблицу в массиве внутри свойств объекта для каждой таблицы… Но несколько попыток добавления данных в массивы заканчиваются пустыми, так что это либо невозможно, и я просто пропустил прошлые ошибки с синтаксисом, который каким-то образом имеет смысл, либо я делаю это неправильно.

Любая помощь?

 class MemberObject
{
  private $dbc;
  private $memberID;
  private $membersTable;
  private $affiliatesTable;
  private $clientsTable;

// Each DB held in own array
  public $member = array();
  public $affiliate = array();
  public $client = array();

  public function __construct(PDO $dbc, $memberID)
  {
    $this->dbc = $dbc;
    $this->memberID = $memberID;
    $this->membersTable = new DatabaseTable($dbc, 'member', 'memberID');
    $this->affiliatesTable = new DatabaseTable($dbc, 'memberAffiliated', 'memberID');
    $this->clientsTable = new DatabaseTable($dbc, 'memberClient', 'memberID');
    $thisMember = $this->membersTable->findById($this->memberID);
    $this->populateData($thisMember, $this->member);

    if ($thisMember = $this->affiliatesTable->findById($this->memberID))
    { // IF get member from affiliatesTable
      $this->populateData($thisMember, $this->affiliate);
    }

    if ($thisMember = $this->clientsTable->findById($this->memberID))
    { // IF get member from clientsTable
      $this->populateData($thisMember, $this->client);
    }
  }

  private function populateData($dataArray, $targetTable)
  {
    foreach ($dataArray as $key => $value)
    {
      $targetTable[$key] = $value;
    }
  }

  public function saveEdit()
  {
    $membersTable->save($this->member);
    if (isset($this->affiliate['affiliateID']))
    {
      $affiliatesTable->save($this->member);
    }
    if (isset($this->client['clientID']))
    {
      $clientsTable->save($this->member);
    }
  }
}```
 

Комментарии:

1. Я не вижу, где вы заполняете массивы

2. Предполагается, что foreach в функции populateData выполняет это на основе доступного массива и предоставленного ему свойства объекта. Эта версия примерно 6-й синтаксис, который я пробовал в этой функции.

3. Какой пример $dataArray ? Вероятно, требуется $this->$targetTable[] = $value; или с именем столбца $this->$targetTable[$key] = $value;

4. Я знал, что фигурные скобки имеют к этому какое-то отношение! Хорошо, я попробую это сделать, но пока я вас здесь, я отправляю $this->member в эту функцию в качестве $TargetTable, так что не делает ли это $this-> $this->member так, как вы его там написали? Я легко теряюсь в этом синтаксисе…

5. На самом деле вам не нужны фигурные скобки, я их удалил, но все, что вы отправляете, не будет содержимым этой переменной bob mary или чего-то еще. Но это не лучший шаблон, возможно, посмотрите на ORM.

Ответ №1:

Я не знаю почему, но отправка свойства объекта в объектную функцию с помощью $this->member не работала, поэтому изменение параметра в функции на строку и использование этого в функции фактически нацелили массив, как и ожидалось:

$this->{$TargetTable}[$key] = $value;