sendFinalHttpResponse(201); } break; case RestfulRequest::TYPE_PUT_SUBRECORD: $record = new $request->record(); $subRecord = new $request->subRecord(); $original = $subRecord->loadById($request->subRecordId); $subRecordRelatedField = $record->getRelatedField($request->subRecord); if ($original[$subRecordRelatedField] != $request->recordId) { sendFinalHttpResponse(400); } $request->input[$subRecordRelatedField] = $request->recordId; $result = $subRecord->update($request->subRecordId, $request->input); sendFinalHttpResponse($result ? 200 : 400); break; case RestfulRequest::TYPE_DELETE_SUBRECORD: $record = new $request->record(); $subRecord = new $request->subRecord(); $original = $subRecord->loadById($request->subRecordId); if (!$original) { sendFinalHttpResponse(404); } $subRecordRelatedField = $record->getRelatedField($request->subRecord); if ($original[$subRecordRelatedField] != $request->recordId) { sendFinalHttpResponse(400); } sendFinalHttpResponse($subRecord->delete($request->subRecordId) ? 200 : 404); break; default: sendFinalHttpResponse(400); }
/** * Load all fields from relation. * Results can also be filtered with an array * * @param int $id parent id * @param string $relation relation name * @param array $filters search filters * @return records array on succes, false otherwise */ function loadAllRelated($id, $relation, $filters = null) { // Relation must exist if (array_key_exists($relation, $this->relations)) { $relatedField = $this->relations[$relation]; } else { return false; } // Create related object $relatedObject = new $relation(); $where = ""; $bindArray = array(); // If we have filters, create WHERE clause if ($filters) { foreach ($filters as $key => $value) { // Limit filters to searchable fields if (in_array($key, $relatedObject->searchables)) { $where .= " AND {$key} LIKE :{$key}"; $bindArray[":" . $key] = $value; } else { // If field isn't searchable we have a bad request sendFinalHttpResponse(400); } } } $statement = $this->db->prepare("SELECT * FROM {$relatedObject->table} WHERE {$relatedField} = :id {$where}"); $statement->bindValue(":id", $id); // Bind search vales foreach ($bindArray as $key => $value) { $statement->bindValue($key, $value); } $statement->execute(); $output = array(); // Map query result to model configured fields while ($row = $statement->fetch(PDO::FETCH_ASSOC)) { $current = array(); foreach (array_keys($row) as $key) { if (array_key_exists($key, $relatedObject->fields)) { $current[$key] = $row[$key]; } } $output[] = $current; } return $output; }