#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;