标签: cakephp

CakePHP模型:COUNT(*)in Containable

我有一个CakePHP 1.3应用程序,并且非常喜欢用于获取数据的Containable行为.

让我们假设我的帖子与评论有一对多的关系.我使用Containable查询(用于分页)所有帖子和所属的注释的列表.但我只对每个帖子有多少评论感兴趣.我没有找到任何方法来实现这个包含可查询的查询而不获取所有注释行.我试过了:

$this->paginate=array(
            'fields' => 'Post.title, Post.created',
            'contain' => array('Comment'=>'COUNT(*) AS count'),
        );
Run Code Online (Sandbox Code Playgroud)

结果"模型"注释"与模型"计数"错误消息无关.

$this->paginate=array(
            'fields' => array('Post.title, Post.created'),
            'contain' => array('Comment'=>array('fields'=>'COUNT(*) AS count'),
        );
Run Code Online (Sandbox Code Playgroud)

如果不起作用,结果集为每个Post包含一个空的Comment数组,除了最后一个数组,它包含count字段,但是所有注释的数量不仅仅是所属的注释.

我的另一个猜测是

$this->paginate=array(
            'fields' => 'Post.title, Post.created, COUNT(Comment.id)',
            'contain' => array('Comment'=>array('fields'=>''),
        );
Run Code Online (Sandbox Code Playgroud)

但这会导致错误,因为hasMany关系是独立查询的,因此Answer表不在Post条目的查询中.我怎样才能计算帖子的评论数量?

php pagination cakephp model

12
推荐指数
2
解决办法
9488
查看次数

CakePHP - 验证可以为空,但如果不为空,则需要至少4个字符和数字

如何创建允许字段为空的验证规则,但如果不是,则需要为数字且长度为4个字符?

这就是我现在拥有的

'year' => array(
        'numeric' => array(
            'rule' => 'numeric',
            'message' => 'Numbers only'
        ),
        'maxLength' => array(
            'rule' => array('maxLength', 4),
            'message' => 'Year in YYYY format'
        ),
        'minLength' => array(
            'rule' => array('minLength', 4),
            'message' => 'Year in YYYY format'
        )
    )
Run Code Online (Sandbox Code Playgroud)

这很好用但是当字段为空时,它仍然运行验证.

谢谢,
Tee

cakephp

12
推荐指数
1
解决办法
1万
查看次数

CakePHP:调用其他Model函数

如何从模型中调用另一个模型中的函数?我不想重复代码.

cakephp

12
推荐指数
2
解决办法
2万
查看次数

有效管理数据变更

我有一张名为Bookings的桌子.此表包含表示针对特定服务进行的预订的数据,其中包含许多变量.

不久之前,我遇到了当前数据结构的问题,因此对预订的任何影响时间,日期或价格的更改都会影响其他相关财务记录,日期预订列表等.

我当时的解决方案是创建一个修改表来跟踪对预订所做的任何更改.然后,每当要求预订模型返回预订时,它将添加修改(在afterFind()蛋糕回调中)并提供最新版本的预订,如下所示(借用Paint绘图):

在此输入图像描述

当您要求预订模式返回预订#1234时,此方法可以正常工作.它返回最新的预订表示,包括所有修改(彼此叠加),包括包含所有修改的数组原始预订数据以供参考.

我的问题是我最近意识到我需要能够使用自定义条件查询此模型,并且如果其中一个条件在其中一个修改中实现,则结果将不匹配,因为模型正在搜索原始模型记录而不是最终呈现的记录.我查询模型以返回abc蓝色(不是灰色)的行的示例:

在此输入图像描述

在该示例中,模型直接查看原始数据,其中行为abc蓝色并且不返回此结果,因为蓝色值位于在找到原始结果附加的修改中.

我现在所做的是查询beforeFind()Booking模型的回调以查找符合给定条件的修改,加入预订以确保任何其他条件仍然匹配.当它在上面的例子中返回蓝色时,它将结果作为类属性存储在数组中,并继续使用常规find(),但不包括退回该预订的ID(因为我们发现了更新的最新版本) ).然后它将它们合并在一起,再次将它们排序等afterFind().

这是有效的,虽然我希望它有点啰嗦.

毕竟,我已经意识到在这个应用程序的其他部分,有些模型可以手动加入预订表并搜索预订.所以现在我需要一种方法能够将所有这些手动连接中的修改直接合并到MySQL中的表中,而不会影响原始数据,最好不要更改我的代码.

我的想法是我需要删除手动连接并创建模型关联.请问beforeFind()afterFind()我说查询客户模型的hasMany预订(将修改应用到每个预订)其预订模式仍运行?

我的另一个选择是通过删除修改中可能包含的任何条件从MySQL返回更多行,然后使用PHP根据我的搜索条件过滤结果.这个选项让我感到有些害怕,因为如果没有这个标准,结果集可能会很大......


我该如何实现这种数据结构?我的关键要求仍然是我不想更改原始的预订记录,而是在顶部添加修改记录,但我需要能够通过模型查询预订(包括修改).

我想尝试在幕后尽可能多地保持这种集成,所以我不必通过我的整个应用程序来改变n看起来像这样的查询数量:

$get_blue = $this->Booking->find('all', array(
    'conditions' => array(
        'Booking.abc' => 'blue'
    )
));
Run Code Online (Sandbox Code Playgroud)

我希望能够隐含地包括对预订的任何修改,以便在上述查询中返回最新的预订.

另一个问题是当预订模型手动加入搜索查询时,如下所示:

$get_transactions_on_blue_bookings = $this->Transaction->find('all', array(
    'joins' => array(
        array(
            'table' => 'sql_bookings_table', // non-standard Cake format, I know - it's an example
            'alias' => 'Booking',
            'type' => 'LEFT', …
Run Code Online (Sandbox Code Playgroud)

php mysql database-design cakephp cakephp-1.3

12
推荐指数
1
解决办法
387
查看次数

CakePHP 3x中的响应式引导程序设计

由于CakePHP 3x具有内置的响应功能,我想知道元素结构和类定义.
我确实熟悉Twitter Bootstrapping(在蛋糕2x项目中完成).但需要熟悉CakePHP 3x版本,因为它是框架中的新功能!
我查看了css/base.css,发现了很少的元素类,比如

Grids: .small-1(to 12), .medium-1(to 12), .large-1(to 12)
Offsets: .small-offset-1(to 12), .medium-offset-1(to 12), .large-offset-1(to 12)
Align: .left, .right.... etc
由于响应式站点使用标准元素结构运行,Cake的引导是否有任何参考,如表单,块等?

css cakephp twitter-bootstrap cakephp-3.0

12
推荐指数
1
解决办法
3032
查看次数

如何根据相关模型的条件进行过滤?

我在用户和联系人上有一个belongsToMany关联.

我想找到给定用户的联系人.我需要类似的东西

$this->Contacts->find()->contain(['Users' => ['Users.id' => 1]]);
Run Code Online (Sandbox Code Playgroud)

该烹饪书讲述了包含条件,定制查找器方法和通过关联键唱歌,但我没有找到如何将这些放在一起.

cakephp associations query-builder conditional-statements cakephp-3.0

12
推荐指数
1
解决办法
1万
查看次数

在CakePHP 3中放置单独的业务逻辑类或类的位置?

我正在设计一个新的应用程序并计划使用CakePHP 3.通常在PHP MVC框架(CakePHP,CodeIgniter)之上设计应用程序时,我实现了一组代表业务层或服务层的独立类(取决于什么你喜欢用的词).因此,堆栈:

- 意见

- 控制器[实际上只是视图的另一部分; 来自C#land的代码隐藏]

- 业务层[业务逻辑所在的位置,因为业务逻辑跨越多个域对象,不适合单个Model/DAO]

- 模型[又名数据访问对象]

...使用域对象(现在是Cake PHP 3中的"实体")在层之间遍历.

我发现Cake PHP 3在默认架构中仍缺乏业务层的任何概念,这令人失望,但几乎无法克服.但毕竟,我的问题实际上是行人.它是:我在哪里放MyBusinessLayer.php?在Cake PHP 2中,我会把它放在app/Lib中,并加载它

App::Import('Lib', 'MyBusinessLayer');

CakePHP 3中的等价物是什么,我该如何加载它?我意识到我可以坚持任何旧的地方和require_once(),但我想知道是否有一种方式更符合Cake PHP标准. 这个问题可以很容易地应用于十行实用程序类,但在我的情况下,它适用于业务层.

cakephp cakephp-3.0

12
推荐指数
1
解决办法
2971
查看次数

Cakephp 3.x:SQLSTATE [HY000]:常规错误:11数据库磁盘映像格式错误

当我将我的应用程序上传到linux时,我收到此错误.这在我的本地Windows系统上工作正常,但在linux服务器上给我错误.当我搜索这个时,我发现这是sqLite相关的问题.如果这是sqLite问题,那么我该如何将其更改为MySQL.

请帮我.

php mysql cakephp cakephp-3.0

12
推荐指数
2
解决办法
1万
查看次数

.ics邀请日历在outlook.com问题中无效

嗨我使用cakephp电子邮件发送附有.ics日历的电子邮件,问题是雅虎和gmail中显示的确认按钮完美但在outlook.com中没有.这是一个.ics文件的例子:

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//T//T//EN
METHOD:REQUEST
BEGIN:VEVENT
UID:20150830T184133-19847-domain.com
DTSTAMP:20150830T184133
DTSTART:20150812T000000Z
DTEND:20150818T000000Z
ORGANIZER;CN=myteam:MAILTO:admin@myteam.org
ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=brabrick@hotmail.com:MAILTO:brabrick@hotmail.com
LOCATION:new york
SUMMARY:Madrid
BEGIN:VALARM
TRIGGER:-PT15M
ACTION:DISPLAY
DESCRIPTION:Reminder
END:VALARM
END:VEVENT
END:VCALENDAR
Run Code Online (Sandbox Code Playgroud)

这是我的PHP代码创建appointement .ics文件:

                $vcal = "BEGIN:VCALENDAR\r\n";
                $vcal .= "VERSION:2.0\r\n";
                $vcal .= "PRODID:-//T//T//EN\r\n";
                $vcal .= "METHOD:REQUEST\r\n";
                $vcal .= "BEGIN:VEVENT\r\n";


                $vcal .= "UID:".date('Ymd').'T'.date('His')."-".rand()."-domain.com\r\n";
                $vcal .= "DTSTAMP:".date('Ymd').'T'.date('His')."\r\n";
                $vcal .= "DTSTART:$visitedate\r\n";
                $vcal .= "DTEND:$visitedate\r\n";             
                $vcal       .=  "ORGANIZER;CN=myteam:MAILTO:admin@myteam.org\r\n";//j'ai ajouté cette ligne
                $vcal       .= "ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=$mail[$iduser]:MAILTO:$mail[$iduser]\r\n";
                //$vcal .= "DTEND:$end\r\n";
                if ($loc != "") $vcal .= "LOCATION:$loc\r\n";
                $vcal .= "SUMMARY:$objet\r\n";
                $vcal .= "BEGIN:VALARM\r\n";
                $vcal .= "TRIGGER:-PT15M\r\n";
                $vcal …
Run Code Online (Sandbox Code Playgroud)

php icalendar outlook calendar cakephp

12
推荐指数
1
解决办法
1353
查看次数

获取请求在邮递员中工作,但在浏览器中不工作

我有一个Angular7在客户端使用的Web应用程序,然后CakePHPApi 我使用的Web应用程序中将Basic Authentication其替换为Token Authentication所有请求都可以正常工作,但只有一个可以在请求中正常运行,Postman但在浏览器中却很奇怪,因为似乎认证存在问题,但不知道原因。

该请求应返回一个Blob以下载文件,因此我使用FPDIin CakePHP来返回pdf

这是邮递员的要求

邮递员头

Date ?Wed, 15 May 2019 12:02:44 GMT
Server ?Apache/2.4.33 (Win32) OpenSSL/1.0.2n PHP/5.6.35
X-Powered-By ?PHP/5.6.35
Content-Disposition ?inline; filename="doc.pdf"
Cache-Control ?private, max-age=0, must-revalidate
Pragma ?public
Access-Control-Allow-Origin ?*
Keep-Alive ?timeout=5, max=100
Connection ?Keep-Alive
Transfer-Encoding ?chunked
Content-Type ?application/pdf
Run Code Online (Sandbox Code Playgroud)

邮递员的身体 邮递员的身体 在Chrome上请求 在Chrome上请求 使用基本身份验证的工作请求 使用基本身份验证的工作请求 使用FireFox

使用FireFox

通话要求

    getWorkListPdf(id: number, cem_id?: number) {
    let uri = `${this.workSessionsUrl}workList/${id}`;
    let params = new HttpParams();
    if (cem_id) {
      params …
Run Code Online (Sandbox Code Playgroud)

php authentication cakephp postman angular

12
推荐指数
1
解决办法
1539
查看次数