shintio / yii2-profile

无需编写代码即可添加CRUD额外属性。

安装: 42

依赖: 0

建议者: 0

安全: 0

星星: 6

观察者: 4

分支: 0

开放问题: 0

类型:yii2-extension

0.1 2017-11-09 06:16 UTC

This package is not auto-updated.

Last update: 2024-09-28 02:17:40 UTC


README

无需更改模型代码即可创建、更新和删除模型的额外属性。

本指南也提供俄语版本,请参阅 此处

安装

安装此扩展的首选方式是通过 composer

运行以下命令之一:

php composer.phar require shintio/yii2-profile "*"

或添加以下内容到你的 composer.json 文件的要求部分:

"shintio/yii2-profile": "*"

开始之前

开始之前,你应该在你的数据库中创建表。你可以在这个文件的末尾找到SQL查询。创建表后,你应该为这些表创建或使用gii生成ActiveRecord模型。

用法

为了添加额外字段,你应该向 'entity_profile_field' 表插入一行。

  • code- 字符串,你可以使用此字段。
  • name- 字符串,此字段的用户可理解名称。用于向用户显示字段名称。
  • type- json,此字段的类型。这个版本只支持 {"type":"text"}。未来更新中将支持更多类型。

命名空间

use shintio\profile\Profile;

通过类名创建Profile对象和ActiveRecord模型

// User- ActiveRecord model
$profile=new Profile(User::className());

通过现有的ActiveRecord创建Profile对象

// We can create new User;
$user=new User();
// Also we can use existing User;
//$user=User::find()->one();

$profile=new Profile($user);

查找Profile

$query=Profile::find(User::className());

// In where function we can use:
// Assoc array for '=' condition
$query->where(['username'=>'admin']); // username- User's attribute
// Indexed array for '%LIKE%' condition
$query->andWhere(['LIKE','firstName','Adm']); // firstName- additional profile field
$query->orWhere(['lastName'=>'Great']); // lastName- additional profile field

$profile=$query->one();
//$profiles=$query->all();

处理字段

echo $profile->getField('firstName'); // Admin

$profile->setField('firstName','Moder');
echo $profile->getField('firstName'); // Moder

$profile->setField('username','moder');

echo '<pre>';
// Get profile in array of Field ojbects
var_dump($profile->getProfile());
// Get profile in assoc array
// var_dump($profile->getProfile(true));
// Same as getProfile(true)
// var_dump($profile->getProfileInArray());
echo '</pre>';

$profile->save();
// username: moder
// firstName: Moder
// lastName: Great

生成示例表的SQL可以在文件 example.sql 中找到。你也可以使用此模板为任何实体创建表。在执行此查询之前,将所有 'entity' 替换为你的实体名称。

CREATE TABLE `entity` (
  `id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `entity_profile` (
  `id` int(11) NOT NULL,
  `entity_id` int(11) NOT NULL,
  `field_id` int(11) NOT NULL,
  `value` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `entity_profile_field` (
  `id` int(11) NOT NULL,
  `code` varchar(255) NOT NULL,
  `name` varchar(255) NOT NULL,
  `type` json NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `entity`
  ADD PRIMARY KEY (`id`);
  
ALTER TABLE `entity_profile`
  ADD PRIMARY KEY (`id`),
  ADD KEY `entity_id` (`entity_id`),
  ADD KEY `field_id` (`field_id`);

ALTER TABLE `entity_profile_field`
  ADD PRIMARY KEY (`id`);

ALTER TABLE `entity_profile`
  ADD CONSTRAINT `entity_profile_ibfk_1` FOREIGN KEY (`field_id`) REFERENCES `entity_profile_field` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `entity_profile_ibfk_2` FOREIGN KEY (`entity_id`) REFERENCES `entity` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
COMMIT;