diff options
Diffstat (limited to 'main/app/sprinkles/extend-user/src/Database')
4 files changed, 214 insertions, 0 deletions
diff --git a/main/app/sprinkles/extend-user/src/Database/Migrations/v400/MembersTable.php b/main/app/sprinkles/extend-user/src/Database/Migrations/v400/MembersTable.php new file mode 100755 index 0000000..a27d485 --- /dev/null +++ b/main/app/sprinkles/extend-user/src/Database/Migrations/v400/MembersTable.php @@ -0,0 +1,34 @@ +<?php +namespace UserFrosting\Sprinkle\ExtendUser\Database\Migrations\v400; + +use UserFrosting\System\Bakery\Migration; +use Illuminate\Database\Schema\Blueprint; +use Illuminate\Database\Schema\Builder; + +class MembersTable extends Migration +{ + public $dependencies = [ + '\UserFrosting\Sprinkle\Account\Database\Migrations\v400\UsersTable' + ]; + + public function up() + { + if (!$this->schema->hasTable('members')) { + $this->schema->create('members', function (Blueprint $table) { + $table->increments('id'); + $table->string('city', 255)->nullable(); + $table->string('country', 255)->nullable(); + + $table->engine = 'InnoDB'; + $table->collation = 'utf8_unicode_ci'; + $table->charset = 'utf8'; + $table->foreign('id')->references('id')->on('users'); + }); + } + } + + public function down() + { + $this->schema->drop('members'); + } +} diff --git a/main/app/sprinkles/extend-user/src/Database/Models/Member.php b/main/app/sprinkles/extend-user/src/Database/Models/Member.php new file mode 100755 index 0000000..98d9d70 --- /dev/null +++ b/main/app/sprinkles/extend-user/src/Database/Models/Member.php @@ -0,0 +1,124 @@ +<?php +namespace UserFrosting\Sprinkle\ExtendUser\Database\Models; + +use UserFrosting\Sprinkle\Account\Database\Models\User; +use UserFrosting\Sprinkle\ExtendUser\Database\Models\MemberAux; +use UserFrosting\Sprinkle\ExtendUser\Database\Scopes\MemberAuxScope; + +trait LinkMemberAux +{ + /** + * The "booting" method of the trait. + * + * @return void + */ + protected static function bootLinkMemberAux() + { + /** + * Create a new MemberAux if necessary, and save the associated member data every time. + */ + static::saved(function ($member) { + $member->createAuxIfNotExists(); + + if ($member->auxType) { + // Set the aux PK, if it hasn't been set yet + if (!$member->aux->id) { + $member->aux->id = $member->id; + } + + $member->aux->save(); + } + }); + } +} + +class Member extends User +{ + use LinkMemberAux; + + protected $fillable = [ + 'user_name', + 'first_name', + 'last_name', + 'email', + 'locale', + 'theme', + 'group_id', + 'flag_verified', + 'flag_enabled', + 'last_activity_id', + 'password', + 'deleted_at', + 'city', + 'country' + ]; + + protected $auxType = 'UserFrosting\Sprinkle\ExtendUser\Database\Models\MemberAux'; + + /** + * Required to be able to access the `aux` relationship in Twig without needing to do eager loading. + * @see http://stackoverflow.com/questions/29514081/cannot-access-eloquent-attributes-on-twig/35908957#35908957 + */ + public function __isset($name) + { + if (in_array($name, [ + 'aux' + ])) { + return true; + } else { + return parent::__isset($name); + } + } + + /** + * Globally joins the `members` table to access additional properties. + */ + protected static function boot() + { + parent::boot(); + + static::addGlobalScope(new MemberAuxScope); + } + + /** + * Custom mutator for Member property + */ + public function setCityAttribute($value) + { + $this->createAuxIfNotExists(); + + $this->aux->city = $value; + } + + /** + * Custom mutator for Member property + */ + public function setCountryAttribute($value) + { + $this->createAuxIfNotExists(); + + $this->aux->country = $value; + } + + /** + * Relationship for interacting with aux model (`members` table). + */ + public function aux() + { + return $this->hasOne($this->auxType, 'id'); + } + + /** + * If this instance doesn't already have a related aux model (either in the db on in the current object), then create one + */ + protected function createAuxIfNotExists() + { + if ($this->auxType && !count($this->aux)) { + // Create aux model and set primary key to be the same as the main user's + $aux = new $this->auxType; + + // Needed to immediately hydrate the relation. It will actually get saved in the bootLinkMemberAux method. + $this->setRelation('aux', $aux); + } + } +} diff --git a/main/app/sprinkles/extend-user/src/Database/Models/MemberAux.php b/main/app/sprinkles/extend-user/src/Database/Models/MemberAux.php new file mode 100755 index 0000000..c826409 --- /dev/null +++ b/main/app/sprinkles/extend-user/src/Database/Models/MemberAux.php @@ -0,0 +1,20 @@ +<?php + +namespace UserFrosting\Sprinkle\ExtendUser\Database\Models; + +use UserFrosting\Sprinkle\Core\Database\Models\Model; + +class MemberAux extends Model +{ + public $timestamps = false; + + /** + * @var string The name of the table for the current model. + */ + protected $table = 'members'; + + protected $fillable = [ + 'city', + 'country' + ]; +} diff --git a/main/app/sprinkles/extend-user/src/Database/Scopes/MemberAuxScope.php b/main/app/sprinkles/extend-user/src/Database/Scopes/MemberAuxScope.php new file mode 100755 index 0000000..c732147 --- /dev/null +++ b/main/app/sprinkles/extend-user/src/Database/Scopes/MemberAuxScope.php @@ -0,0 +1,36 @@ +<?php + +namespace UserFrosting\Sprinkle\ExtendUser\Database\Scopes; + +use Illuminate\Database\Eloquent\Scope; +use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Builder; + +class MemberAuxScope implements Scope +{ + /** + * Apply the scope to a given Eloquent query builder. + * + * @param \Illuminate\Database\Eloquent\Builder $builder + * @param \Illuminate\Database\Eloquent\Model $model + * @return void + */ + public function apply(Builder $builder, Model $model) + { + $baseTable = $model->getTable(); + // Hardcode the table name here, or you can access it using the classMapper and `getTable` + $auxTable = 'members'; + + // Specify columns to load from base table and aux table + $builder->addSelect( + "$baseTable.*", + "$auxTable.city as city", + "$auxTable.country as country" + ); + + // Join on matching `member` records + $builder->leftJoin($auxTable, function ($join) use ($baseTable, $auxTable) { + $join->on("$auxTable.id", '=', "$baseTable.id"); + }); + } +} |