aboutsummaryrefslogtreecommitdiffhomepage
path: root/main/app/sprinkles/extend-user/src/Database
diff options
context:
space:
mode:
authormarvin-borner@live.com2018-04-16 21:09:05 +0200
committermarvin-borner@live.com2018-04-16 21:09:05 +0200
commitcf14306c2b3f82a81f8d56669a71633b4d4b5fce (patch)
tree86700651aa180026e89a66064b0364b1e4346f3f /main/app/sprinkles/extend-user/src/Database
parent619b01b3615458c4ed78bfaeabb6b1a47cc8ad8b (diff)
Main merge to user management system - files are now at /main/public/
Diffstat (limited to 'main/app/sprinkles/extend-user/src/Database')
-rwxr-xr-xmain/app/sprinkles/extend-user/src/Database/Migrations/v400/MembersTable.php34
-rwxr-xr-xmain/app/sprinkles/extend-user/src/Database/Models/Member.php124
-rwxr-xr-xmain/app/sprinkles/extend-user/src/Database/Models/MemberAux.php20
-rwxr-xr-xmain/app/sprinkles/extend-user/src/Database/Scopes/MemberAuxScope.php36
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");
+ });
+ }
+}