<?php namespace App\Models; use App\Tables\Column; use Illuminate\Support\Collection; use Riesjart\Relaquent\Model\Concerns\HasRelaquentRelationships; /** * Table revision (a set of rows) * * @property int $id * @property \Carbon\Carbon $created_at * @property \Carbon\Carbon $updated_at * @property int $ancestor_id * @property string $note * @property object $columns * @property int $row_count - cached number of rows in the revision * @property-read Revision|null $parentRevision * @property-read Row[]|Collection $rows * @property-read Proposal|null $sourceProposal - proposal that was used to create this revision * @property-read Proposal[]|Collection $dependentProposals */ class Revision extends BaseModel { use HasRelaquentRelationships; protected $guarded = []; protected $casts = [ 'columns' => 'object', ]; /** Included rows */ public function rows() { return $this->belongsToMany(Row::class, 'revision_row_pivot')->as('_row_pivot'); } /** Included rows * @param Column[] $columns * @return \Illuminate\Database\Query\Builder|static */ public function rowsData($columns, $withId=true, $named=true) { $selects = $withId ? ["data->>'_id' as _id"] : []; foreach ($columns as $col) { $selects[] = "data->>'$col->id' as " . ($named ? $col->name : $col->id); } return $this->rows()->select([])->selectRaw(implode(', ', $selects)); } /** Proposal that lead to this revision */ public function sourceProposal() { return $this->hasOneThrough(Proposal::class, 'revision_proposal_pivot'); } /** Proposals that depend on this revision */ public function dependentProposals() { return $this->hasMany(Proposal::class); } /** Revision this orignates from */ public function parentRevision() { return $this->belongsTo(Revision::class, 'ancestor_id'); } /** Tables referencing this revision */ public function tables() { return $this->belongsToMany(Table::class, 'table_revision_pivot'); } }