Skip to content

Instantly share code, notes, and snippets.

@markstory
Last active December 23, 2015 03:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save markstory/c2a10524cc690606041d to your computer and use it in GitHub Desktop.
Save markstory/c2a10524cc690606041d to your computer and use it in GitHub Desktop.
<?php
namespace App\Model\Entity;
use Cake\ORM\Entity;
/**
* Bookmark Entity.
*/
class Bookmark extends Entity
{
/**
* Fields that can be mass assigned using newEntity() or patchEntity().
*
* @var array
*/
protected $_accessible = [
'user_id' => true,
'title' => true,
'description' => true,
'url' => true,
'user' => true,
'tags' => true,
'starred_tags' => true,
'secondary_tags' => true,
];
}
<?php
namespace App\Model\Table;
use Cake\ORM\Query;
use Cake\ORM\Table;
use Cake\ORM\RulesChecker;
use Cake\Validation\Validator;
/**
* Bookmarks Model
*/
class BookmarksTable extends Table
{
/**
* Initialize method
*
* @param array $config The configuration for the Table.
* @return void
*/
public function initialize(array $config)
{
$this->table('bookmarks');
$this->displayField('title');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
$this->belongsTo('Users', [
'foreignKey' => 'user_id',
]);
$this->belongsToMany('Tags', [
'through' => 'BookmarksTags',
]);
$this->belongsToMany('StarredTags', [
'className' => 'Tags',
'targetForeignKey' => 'tag_id',
'through' => 'BookmarksTags',
'conditions' => ['BookmarksTags.starred']
]);
$this->belongsToMany('SecondaryTags', [
'className' => 'Tags',
'targetForeignKey' => 'tag_id',
'through' => 'BookmarksTags',
'conditions' => ['BookmarksTags.starred' => false]
]);
}
}
<?php
namespace App\Shell;
use Cake\Console\Shell;
use Cake\ORM\TableRegistry;
class BugShell extends Shell
{
public function main()
{
$id = 50;
$bookmarks = TableRegistry::get('Bookmarks');
$bookmark = $bookmarks->get($id);
$data = [
'starred_tags' => [
['id' => 1, '_joinData' => ['starred' => 1]],
['id' => 2, '_joinData' => ['starred' => 1]],
['id' => 3, '_joinData' => ['starred' => 1]],
]
];
$bookmarks->patchEntity($bookmark, $data);
$bookmarks->save($bookmark);
$bookmark = $bookmarks->get($id);
$data = [
'starred_tags' => [
['id' => 1, '_joinData' => ['starred' => 1]]
]
];
$bookmarks->patchEntity($bookmark, $data);
$bookmarks->save($bookmark);
}
}
2015-12-23 03:08:25 Debug: SELECT `Bookmarks`.`id` AS `Bookmarks__id`, `Bookmarks`.`user_id` AS `Bookmarks__user_id`, `Bookmarks`.`title` AS `Bookmarks__title`, `Bookmarks`.`description` AS `Bookmarks__description`, `Bookmarks`.`url` AS `Bookmarks__url`, `Bookmarks`.`created` AS `Bookmarks__created`, `Bookmarks`.`updated` AS `Bookmarks__updated`, `Bookmarks`.`starred` AS `Bookmarks__starred` FROM `bookmarks` `Bookmarks` WHERE `Bookmarks`.`id` = 50 LIMIT 1
2015-12-23 03:08:25 Debug: SELECT `StarredTags`.`id` AS `StarredTags__id`, `StarredTags`.`title` AS `StarredTags__title`, `StarredTags`.`created` AS `StarredTags__created`, `StarredTags`.`updated` AS `StarredTags__updated` FROM `tags` `StarredTags` WHERE (`StarredTags`.`id` = 1 OR `StarredTags`.`id` = 2 OR `StarredTags`.`id` = 3)
2015-12-23 03:08:25 Debug: BEGIN
2015-12-23 03:08:25 Debug: SELECT `BookmarksTags`.`bookmark_id` AS `BookmarksTags__bookmark_id`, `BookmarksTags`.`tag_id` AS `BookmarksTags__tag_id`, `BookmarksTags`.`starred` AS `BookmarksTags__starred`, `StarredTags`.`id` AS `StarredTags__id`, `StarredTags`.`title` AS `StarredTags__title`, `StarredTags`.`created` AS `StarredTags__created`, `StarredTags`.`updated` AS `StarredTags__updated` FROM `bookmarks_tags` `BookmarksTags` LEFT JOIN `tags` `StarredTags` ON `StarredTags`.`id` = (`BookmarksTags`.`tag_id`) WHERE (`bookmark_id` = 50 AND BookmarksTags.starred)
2015-12-23 03:08:25 Debug: DELETE FROM `bookmarks_tags` WHERE (`bookmark_id` = 50 AND `tag_id` = 1)
2015-12-23 03:08:25 Debug: DELETE FROM `bookmarks_tags` WHERE (`bookmark_id` = 50 AND `tag_id` = 2)
2015-12-23 03:08:25 Debug: DELETE FROM `bookmarks_tags` WHERE (`bookmark_id` = 50 AND `tag_id` = 3)
2015-12-23 03:08:25 Debug: SELECT 1 AS `existing` FROM `bookmarks_tags` `BookmarksTags` WHERE (`BookmarksTags`.`bookmark_id` = 50 AND `BookmarksTags`.`tag_id` = 1) LIMIT 1
2015-12-23 03:08:25 Debug: INSERT INTO `bookmarks_tags` (`bookmark_id`, `tag_id`, `starred`) VALUES (50, 1, 1)
2015-12-23 03:08:25 Debug: SELECT 1 AS `existing` FROM `bookmarks_tags` `BookmarksTags` WHERE (`BookmarksTags`.`bookmark_id` = 50 AND `BookmarksTags`.`tag_id` = 2) LIMIT 1
2015-12-23 03:08:25 Debug: INSERT INTO `bookmarks_tags` (`bookmark_id`, `tag_id`, `starred`) VALUES (50, 2, 1)
2015-12-23 03:08:25 Debug: SELECT 1 AS `existing` FROM `bookmarks_tags` `BookmarksTags` WHERE (`BookmarksTags`.`bookmark_id` = 50 AND `BookmarksTags`.`tag_id` = 3) LIMIT 1
2015-12-23 03:08:25 Debug: INSERT INTO `bookmarks_tags` (`bookmark_id`, `tag_id`, `starred`) VALUES (50, 3, 1)
2015-12-23 03:08:25 Debug: COMMIT
2015-12-23 03:08:25 Debug: SELECT `Bookmarks`.`id` AS `Bookmarks__id`, `Bookmarks`.`user_id` AS `Bookmarks__user_id`, `Bookmarks`.`title` AS `Bookmarks__title`, `Bookmarks`.`description` AS `Bookmarks__description`, `Bookmarks`.`url` AS `Bookmarks__url`, `Bookmarks`.`created` AS `Bookmarks__created`, `Bookmarks`.`updated` AS `Bookmarks__updated`, `Bookmarks`.`starred` AS `Bookmarks__starred` FROM `bookmarks` `Bookmarks` WHERE `Bookmarks`.`id` = 50 LIMIT 1
2015-12-23 03:08:25 Debug: SELECT `StarredTags`.`id` AS `StarredTags__id`, `StarredTags`.`title` AS `StarredTags__title`, `StarredTags`.`created` AS `StarredTags__created`, `StarredTags`.`updated` AS `StarredTags__updated` FROM `tags` `StarredTags` WHERE `StarredTags`.`id` = 1
2015-12-23 03:08:25 Debug: BEGIN
2015-12-23 03:08:25 Debug: SELECT `BookmarksTags`.`bookmark_id` AS `BookmarksTags__bookmark_id`, `BookmarksTags`.`tag_id` AS `BookmarksTags__tag_id`, `BookmarksTags`.`starred` AS `BookmarksTags__starred`, `StarredTags`.`id` AS `StarredTags__id`, `StarredTags`.`title` AS `StarredTags__title`, `StarredTags`.`created` AS `StarredTags__created`, `StarredTags`.`updated` AS `StarredTags__updated` FROM `bookmarks_tags` `BookmarksTags` LEFT JOIN `tags` `StarredTags` ON `StarredTags`.`id` = (`BookmarksTags`.`tag_id`) WHERE (`bookmark_id` = 50 AND BookmarksTags.starred)
2015-12-23 03:08:25 Debug: DELETE FROM `bookmarks_tags` WHERE (`bookmark_id` = 50 AND `tag_id` = 1)
2015-12-23 03:08:25 Debug: DELETE FROM `bookmarks_tags` WHERE (`bookmark_id` = 50 AND `tag_id` = 2)
2015-12-23 03:08:25 Debug: DELETE FROM `bookmarks_tags` WHERE (`bookmark_id` = 50 AND `tag_id` = 3)
2015-12-23 03:08:25 Debug: SELECT 1 AS `existing` FROM `bookmarks_tags` `BookmarksTags` WHERE (`BookmarksTags`.`bookmark_id` = 50 AND `BookmarksTags`.`tag_id` = 1) LIMIT 1
2015-12-23 03:08:25 Debug: INSERT INTO `bookmarks_tags` (`bookmark_id`, `tag_id`, `starred`) VALUES (50, 1, 1)
2015-12-23 03:08:25 Debug: COMMIT
CREATE TABLE `bookmarks` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`title` varchar(50) DEFAULT NULL,
`description` text,
`url` text,
`created` datetime DEFAULT NULL,
`updated` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `tags` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) DEFAULT NULL,
`created` datetime DEFAULT NULL,
`updated` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `title` (`title`)
);
CREATE TABLE `bookmarks_tags` (
`bookmark_id` int(11) NOT NULL,
`tag_id` int(11) NOT NULL,
`starred` tinyint(1) DEFAULT '0',
PRIMARY KEY (`bookmark_id`,`tag_id`),
KEY `tag_idx` (`tag_id`,`bookmark_id`),
CONSTRAINT `bookmarks_tags_ibfk_1` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`),
CONSTRAINT `bookmarks_tags_ibfk_2` FOREIGN KEY (`bookmark_id`) REFERENCES `bookmarks` (`id`)
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment