cakephp笔记——在运行期间创建和销毁关联

cakephp进行查找时,如果不对表与表之间的关联进行限制,经常会返回‘一大坨’东西,从而使得返回的数据变得复杂和冗余,所以有时候需要在运行时建立和销毁模型关联。比如以下几种情况:你想减少获取的关联数据的量,但是你的所有关联都是循环的第一级,或者你想要改变定义关联的方法以便排序或者过滤关联数据。因为如果数据表间存在很多关联的话,查询后所返回的值会将所关联的一并返回回来。因此可以使用bindModel()和unbindModel()方法来实现在运行期间创建和销毁关联。

使用例如$this->Leader->unbindModel(array('hasMany' => array('Follower'));即能够将表Leader和表Follower间的关系销毁,从而进行Leader查询的时候不会连带一起查询出后者的数据,但是这种关联的销毁以及创建都是一次性的,只要操作过了一次之后依然恢复到原来的关系。

bindModel() 的基本用法是封装在以你尝试建立的关联类型命名的数组中的常规数组:

1$this->Model->bindModel(
2     array('associationName' => array(
3             'associatedModelClassName' => array(
4                 // normal association keys go here...
5             )
6         )
7     )
8 );

连接表

可以允许你进行跨越多张表的较为复杂的查询,在表间强制添加 join 时,你需要在调用 Model::find() 时使用 “modern” 语法,在 $options 数组中添加 ‘joins’ 键。例如:

 1 $options['joins'] = array(
 2     array('table' => 'channels',
 3         'alias' => 'Channel',
 4         'type' => 'LEFT',
 5         'conditions' => array(
 6             'Channel.id = Item.channel_id',
 7         )
 8     )
 9 );
10 
11 $Item->find('all', $options);

注意 ‘join’ 数组不是一个键。在上面的例子中, Item 的模型 left join 到 channels 表。你可以用模型名为表起别名,以使检索到的数组完全符合 CakePHP 的数据结构。

定义 join 所用的键如下:

  • table: 要连接的表。
  • alias: 表的别名。最好使用关联模型名。
  • type: 连接类型: inner, left 或者 right。
  • conditions: 执行 join 的条件。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CakePHP的操作日志记录可以使用CakePHP的内置功能。首先,您需要创建一个名为`operation_logs`的数据库表,其中包含以下字段: - id(主键) - user_id(用户ID) - action(操作名称) - created(创建时间) 接下来,您需要在CakePHP创建一个`OperationLogsTable`模型来管理`operation_logs`表。该模型应该具有一个`logAction`方法,用于记录操作日志。该方法应该接受三个参数:用户ID,操作名称和记录时间。以下是一个示例实现: ```php // src/Model/Table/OperationLogsTable.php namespace App\Model\Table; use Cake\ORM\Table; class OperationLogsTable extends Table { public function logAction($userId, $action, $timestamp) { $log = $this->newEntity([ 'user_id' => $userId, 'action' => $action, 'created' => $timestamp ]); $this->save($log); } } ``` 现在,您可以在您的应用程序中的任何控制器中使用`OperationLogsTable`模型来记录操作日志。例如: ```php // src/Controller/ArticlesController.php namespace App\Controller; use App\Model\Table\OperationLogsTable; use Cake\Controller\Controller; class ArticlesController extends Controller { public function index() { $this->loadModel('OperationLogs'); $this->OperationLogs->logAction($this->Auth->user('id'), 'viewed articles', time()); // rest of action code } } ``` 此代码将记录一个名为“viewed articles”的操作,该操作由当前已验证用户执行,并在当前时间创建了一个操作日志记录。您可以像这样记录任何操作,只要您想要跟踪和记录。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值