<?phpreturn [/* |-------------------------------------------------------------------------- | User model |-------------------------------------------------------------------------- | | Here you may specify the fully qualified class name of the user model class. | */'user_model'=>App\Models\User::class,/* |-------------------------------------------------------------------------- | Table prefix |-------------------------------------------------------------------------- | | Here you may specify the prefix for all mark tables. | If set, all migrations should be named with the given prefix and | the mark's class name. | */'table_prefix'=>'markable_',/* |-------------------------------------------------------------------------- | Allowed values |-------------------------------------------------------------------------- | | Here you may specify the list of allowed values for each mark type. | If a specific mark should not accept any values, you can avoid adding it | to the list. | The array key name should match the mark's class name in lower case. | */'allowed_values'=> ['reaction'=> [], ],];
Usage
Basic
To use the package, add the Maize\Markable\Markable trait to the model where you want to have marks.
Once done, you can define the list of possible marks for the given model implementing the $marks array with the list of mark classes' namespace.
Here's an example model including the Markable trait and implementing the Like mark:
useApp\Models\Course;useMaize\Markable\Models\Like;$course =Course::firstOrFail();$user =auth()->user();Like::add($course, $user); // marks the course liked for the given userLike::remove($course, $user); // unmarks the course liked for the given userLike::toggle($course, $user); // toggles the course like for the given userLike::has($course, $user); // returns whether the given user has marked as liked the course or notLike::count($course); // returns the amount of like marks for the given course
Custom mark model
The package allows you to define custom marks.
First thing you need to do is create a migration which defines the new mark model. The package works with separate tables for each mark in order to increase the performances when executing related queries.
The migration table name should contain the prefix defined in table_prefix attribute under config/markable.php. Default prefix is set to markable_.
Once done, you can create a new class which extends the abstract Mark class and implement the markableRelationName method, which is used to retrieve the users who marked a given model entity with the mark entity as pivot.
You can also override the markRelationName method, which is used to retrieve the list of marks of a given model entity. By default, the relation name is the plural name of the mark class name.
Here's an example model for the bookmarks mark:
<?phpnamespaceApp\Models;useMaize\Markable\Mark;classBookmarkextendsMark{publicstaticfunctionmarkableRelationName():string {return'bookmarkers'; }/** * The override is useless in this case, as I am returning the default * relation name which is the plural name of the mark class name (bookmarks, indeed) */publicstaticfunctionmarkRelationName():string {return'bookmarks'; }}
That's all! You can now include the custom mark to all models you wish and use it as explained before.
Working with mark values
You might need a custom mark with a subset of allowed values.
In this case, you can just define your custom mark as explained before and add the list of allowed values in allowed_values array under config/markable.php.
The array key name should match the mark's class name in lower case.
useApp\Models\Post;useMaize\Markable\Models\Reaction;$post =Post::firstOrFail();$user =auth()->user();Reaction::add($post, $user,'kissing_heart'); // adds the 'kissing_heart' reaction to the post for the given userReaction::remove($post, $user,'kissing_heart'); // removes the 'kissing_heart' reaction to the post for the given userReaction::toggle($post, $user,'heart'); // toggles the 'heart' reaction to the post for the given userReaction::has($post, $user, 'heart'); // returns whether the user has reacted with the 'heart' reaction to the given post or not
Reaction::count($post, 'person_raising_hand'); // returns the amount of 'person_raising_hand' reactions for the given post
Retrieve the list of marks of an entity with eloquent
useApp\Models\Course;useApp\Models\Post;Course::firstOrFail()->likes; // returns the collection of like marks related to the coursePost::firstOrFail()->reactions; // returns the collection of reaction marks related to the post
Retrieve the list of users who marked an entity with eloquent
useApp\Models\Course;useApp\Models\Post;Course::firstOrFail()->likers; // returns the collection of users who liked the course along with the mark value as pivot
Post::firstOrFail()->reacters; // returns the collection of users who reacted to the post along with the mark value as pivot
Filter marked models with eloquent
useApp\Models\Course;useApp\Models\Post;Course::whereHasLike(auth()->user())->get(); // returns all course models with a like from the given userPost::whereHasReaction(auth()->user(),'heart')->get(); // returns all post models with a 'heart' reaction from the given user