mirror of
https://github.com/beestat/app.git
synced 2025-05-24 02:14:03 -04:00
192 lines
5.6 KiB
PHP
192 lines
5.6 KiB
PHP
<?php
|
|
|
|
namespace cora;
|
|
|
|
/**
|
|
* CRUD base class for most resources. Provides the ability to create
|
|
* (insert), read (select), update (update), and delete (update set
|
|
* deleted=1). There are also a few extra methods: read_id, get, and undelete.
|
|
*
|
|
* These methods can (and should) be overridden by child classes. The most
|
|
* basic override would simply call the parent function. More advanced
|
|
* overrides might set a value like created_by before creating.
|
|
*
|
|
* Child classes can, at any time, call the parent methods directly from any
|
|
* of their methods.
|
|
*
|
|
* @author Jon Ziebell
|
|
*/
|
|
abstract class crud extends api {
|
|
|
|
public static $converged = [];
|
|
|
|
public static $user_locked = true;
|
|
|
|
/**
|
|
* Insert an item into the current resource with the provided attributes.
|
|
* Setting of the primary key column is not allowed and will be overwritten
|
|
* if you try.
|
|
*
|
|
* @param array $attributes An array of attributes to set for this item
|
|
*
|
|
* @return mixed The id of the inserted row.
|
|
*/
|
|
public function create($attributes) {
|
|
unset($attributes[$this->table . '_id']);
|
|
|
|
if($this::$user_locked === true) {
|
|
$attributes['user_id'] = $this->session->get_user_id();
|
|
}
|
|
|
|
return $this->database->create($this->resource, $attributes);
|
|
}
|
|
|
|
/**
|
|
* Read items from the current resource according to the specified
|
|
* $attributes. Only undeleted items are selected by default. This can be
|
|
* altered by manually specifying deleted=1 or deleted=[0, 1] in
|
|
* $attributes.
|
|
*
|
|
* @param array $attributes An array of key value pairs to search by and can
|
|
* include arrays if you want to search in() something.
|
|
* @param array $columns The columns from the resource to return. If not
|
|
* specified, all columns are returned.
|
|
*
|
|
* @return array The requested items with the requested columns in a
|
|
* 0-indexed array.
|
|
*/
|
|
public function read($attributes = [], $columns = []) {
|
|
if($attributes === null) {
|
|
$attributes = [];
|
|
}
|
|
if($columns === null) {
|
|
$columns = [];
|
|
}
|
|
|
|
$attributes = $attributes + ['deleted' => 0];
|
|
|
|
if($this::$user_locked === true) {
|
|
$attributes['user_id'] = $this->session->get_user_id();
|
|
}
|
|
|
|
return $this->database->read($this->resource, $attributes, $columns);
|
|
}
|
|
|
|
/**
|
|
* See comment on crud->read() for more detail. The return array is
|
|
* indexed by the primary key of the resource items.
|
|
*
|
|
* @param array $attributes An array of key value pairs to search by and
|
|
* can include arrays if you want to search in() something.
|
|
* @param array $columns The columns from the resource to return. If not
|
|
* specified, all columns are returned.
|
|
*
|
|
* @return array The requested items with the requested colums in a primary-
|
|
* key-indexed array.
|
|
*/
|
|
public function read_id($attributes = [], $columns = []) {
|
|
if($attributes === null) {
|
|
$attributes = [];
|
|
}
|
|
if($columns === null) {
|
|
$columns = [];
|
|
}
|
|
|
|
// If no columns are specified to read, force the primary key column to be
|
|
// included. This will ensure that no error is thrown when the result of the
|
|
// query is converted into the ID array.
|
|
if(count($columns) > 0) {
|
|
$columns[] = $this->table . '_id';
|
|
}
|
|
|
|
$rows = $this->read($attributes, $columns);
|
|
$rows_id = [];
|
|
foreach($rows as $row) {
|
|
// Remove the *_id column and add in the row.
|
|
$rows_id[$row[$this->table . '_id']] = $row;
|
|
}
|
|
return $rows_id;
|
|
}
|
|
|
|
/**
|
|
* Get a single item, searching using whatever attributes you specify.
|
|
*
|
|
* @param array|int $attributes Search attributes or the ID of the row you
|
|
* want.
|
|
*
|
|
* @return array The found item.
|
|
*
|
|
* @throws \Exception If more than one item was found.
|
|
*/
|
|
public function get($attributes) {
|
|
// Doing this so I can call $this->get(#) which is pretty common.
|
|
if(is_array($attributes) === false) {
|
|
$id = $attributes;
|
|
$attributes = [];
|
|
$attributes[$this->table . '_id'] = $id;
|
|
}
|
|
|
|
$items = $this->read($attributes);
|
|
if(count($items) > 1) {
|
|
throw new \Exception('Tried to get but more than one item was returned.', 1100);
|
|
}
|
|
else if(count($items) === 0) {
|
|
return null;
|
|
}
|
|
else {
|
|
return $items[0];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Updates the current resource item with the provided id and sets the
|
|
* provided attributes.
|
|
*
|
|
* @param int $id The id of the item to update.
|
|
* @param array $attributes An array of attributes to set for this item.
|
|
*
|
|
* @return int The updated row.
|
|
*/
|
|
public function update($attributes) {
|
|
// Get the item first to see if it exists. The get call will throw an
|
|
// exception if the ID you sent does not exist or cannot be read due to the
|
|
// user_locked setting.
|
|
$this->get($attributes[$this->table . '_id']);
|
|
|
|
return $this->database->update($this->resource, $attributes);
|
|
}
|
|
|
|
/**
|
|
* Deletes an item with the provided id from the current resource. Deletes
|
|
* always update the row to set deleted=1 instead of removing it from the
|
|
* database.
|
|
*
|
|
* @param int $id The id of the item to delete.
|
|
*
|
|
* @return array The deleted row.
|
|
*/
|
|
public function delete($id) {
|
|
$attributes = [];
|
|
$attributes[$this->table . '_id'] = $id;
|
|
$attributes['deleted'] = 1;
|
|
|
|
return $this->update($attributes);
|
|
}
|
|
|
|
/**
|
|
* Undeletes an item with the provided id from the current resource. This
|
|
* will update the row and set deleted = 0.
|
|
*
|
|
* @param int $id The id of the item to delete.
|
|
*
|
|
* @return array The undeleted row.
|
|
*/
|
|
public function undelete($id) {
|
|
$attributes = [];
|
|
$attributes[$this->table . '_id'] = $id;
|
|
$attributes['deleted'] = 0;
|
|
|
|
return $this->update($attributes);
|
|
}
|
|
}
|