以前我依靠递归,但我没有得到一些解决方案,然后我发现Containable适用于这些.
我正在开发一个电影评论网站.在那里,我需要显示与特定类型相关的电影列表.
我有以下代码:
//example
$genre = "drama";
$options = array(
'contain' => array(
'Movie',
'MoveiGenre.Genre' => array(
'conditions' => array('MovieGenre.Genre.name = "'.$genre.'"')
),
'MovieGenre.Genre.name'
),
'recursive' => 2,
'limit' => 10
);
$this->paginate = $options;
$this->set('movies',$this->paginate());
Run Code Online (Sandbox Code Playgroud)
真正的问题从这里开始,我得到所有的电影,即使它与流派"戏剧"无关.我哪里错了?
让我解释一下数据库表:
表:电影
----------------------------
| id | title | description |
----------------------------
| 1 | mov1 | something1 |
| 2 | mov2 | something2 |
| 3 | mov3 | something3 |
----------------------------
Run Code Online (Sandbox Code Playgroud)
表:流派
---------------
| id | name |
---------------
| 1 …Run Code Online (Sandbox Code Playgroud) recursion cakephp conditional-statements containable cakephp-2.0
我是CakePHP的新手,无法弄清楚如何使用Containable行为调用模型类的read()方法.我可以用find()执行以下操作
$this->T->find('all', array (
'contain' => array (
'C',
'L' => array (
'fields' => array ('L.id, L.time'),
'I' => array (
'fields' => array ('I.id','I.time'),
'J.name',
'J.id'
)
)
)
);
Run Code Online (Sandbox Code Playgroud)
这正如我预期的那样工作,但我不想得到T的所有实例,而是得到id = $ id的实例,所以我可以将它传递给'view'视图.但传递给find的数组在做的时候不起作用
$this->T->read(
array (
'contain' => array (
'C',
'L' => array (
'fields' => array ('L.id, L.time'),
'I' => array (
'fields' => array ('I.id','I.time'),
'J.name',
'J.id'
)
)
)
, $id)
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?
我有三个模型,用户,评论和页面.
用户 有很多 评论,评论 属于 Pages.
所有模型都使用该containable行为,默认为recursive -1.
如果我叫find()上查询留言,与含有包括请求页面模式的领域,这正确返回使用结果的单个查询,自动地加入页表给用户.
如果我从User模型(包含 Comment和Comment.Page)调用类似的查询,则结果是查询来获取注释,然后是每个注释的查询以获取相关页面.
有没有办法配置模型来维持JOIN优化?我假设相关模型(Comments)上的belongsTo声明将跟随主机模型(Users).
UPDATE
我应该澄清,我的问题使用了我的实际案例研究的简化版本.虽然我需要的最小解决方案将包括这个初始Model hasMany Model belongsTo Model结构,但我也在链中的一个或多个其他belongsTo 模型上寻找解决方案(我会自动使用LEFT JOIN,因为这将是可行).
几次将Containable Behavior添加到我的各种模型类之后,我很清楚只需将该行放入AppModel中,从而使每个模型都可以包含.然后让我想知道,是否存在某种特定模型具有可包含行为不可取或适得其反的情况?
正如我从cakephp文档中所理解的那样,'containable'-Behavior的一个优点是,如果你需要更少的数据,它可以获取更少的数据......
但在我的用户和用户组之间的连接中,这似乎不起作用.
我的关联看起来像:
Group
hasMany: Membership
User
hasMany: Membership
Membership
belongsTo: User, Group
Run Code Online (Sandbox Code Playgroud)
(我没有使用HABTM,而是使用两者之间的模型'Membership'来加入用户和组).
所有模型都实现了"可包含"行为.
现在我希望获得具有特定ID的组的所有成员,只有他们的ID和邮件地址.我的查询是这样构建的:
$members = $this->Membership->find('all', array(
'conditions' => array(
'group_id' => $id
),
'contain' => array(
'User' => array(
'fields' => array('id', 'fullName')
),
)
));
Run Code Online (Sandbox Code Playgroud)
但结果数组看起来像:
array(
(int) 0 => array(
'Membership' => array(
'id' => '1',
'group_id' => '1',
'user_id' => '1',
'role' => 'member'
),
'Group' => array(
'id' => '1',
'name' => 'Foo Group'
),
'User' => array(
'password' => '*****',
'id' …Run Code Online (Sandbox Code Playgroud) 当我尝试:
// Removed the limit to ensure that all of the group notes items can be found and collapsed
$recent_notes = $this->User->Note->find('all', array(
'recursive' => 2,
'order' => 'Note.created DESC',
'conditions' => $conditions,
'contains' => array(
'NotesUser', 'Poster', 'Comment' => array('Poster')
)
));
Run Code Online (Sandbox Code Playgroud)
它不会限制输出 - 我得到每个相关的模型.但是,当我没有指定recursive为2,或者如果我指定为1,我错过了Comment=>Poster模型.
我怎样才能获得我需要的模型?谢谢!
我正试图在分类列表中找到用户的杂货.关联是Category hasMany Item hasMany User through Grocery.我正在使用可包含行为,并没有过滤掉所有其他Grocery.它基本上返回每个项目.
我的控制器功能:
function showlist() {
$categories = $this->Category->find('all', array(
'contain' => array(
'Item' => array(
'Grocery' => array(
'conditions' => array(
'Grocery.user_id =' => $this->Auth->user('id')
)
)
)
)
));
Run Code Online (Sandbox Code Playgroud)
返回的数组:
Array
(
[0] => Array
(
[Category] => Array
(
[id] => 10
[parent_id] =>
[name] => Dairy
[lft] => 1
[rght] => 6
)
[Item] => Array
(
)
)
[1] => Array
(
[Category] => Array
(
[id] => 11
[parent_id] …Run Code Online (Sandbox Code Playgroud) 我有以下情况:作品有一个Image属于ImageGroup.
如果我这样做:
$works = $this->Work->find('all', array(
'contain' => array(
'PreviewImage' => array(
'fields' => array('PreviewImage.id', 'PreviewImage.filename', 'PreviewImage.alt'),
'ImageGroup' => array(
'fields' => array('ImageGroup.id')
)
)
)
));
Run Code Online (Sandbox Code Playgroud)
我会得到这个:
array(
(int) 0 => array(
'Work' => array(
'id' => '1',
'title_us' => 'Work Title',
'title_de' => 'Arbeit Titel',
'alias' => 'work-title',
'pdf_id' => '1',
'date' => '2013-10-08 10:36:00',
'title_graphic_us_id' => '1',
'title_graphic_de_id' => '2',
'body_us' => 'English Content',
'body_de' => 'Deutscher Inhalt',
'preview_image_id' => '3',
'preview_us' => 'English Preview Text',
'preview_de' …Run Code Online (Sandbox Code Playgroud) 我需要对Product属于特定Category(HABTM关联)的s 列表进行分页.
在我的Product模型中,我有
var $actsAs = array('Containable');
var $hasAndBelongsToMany = array(
'Category' => array(
'joinTable' => 'products_categories'
)
);
Run Code Online (Sandbox Code Playgroud)
并在 ProductsController
$this->paginate = array(
'limit' => 20,
'order' => array('Product.name' => 'ASC'),
'contain' => array(
'Category' => array(
'conditions' => array(
'Category.id' => 3
)
)
)
);
$this->set('products', $this->paginate());
Run Code Online (Sandbox Code Playgroud)
但是,生成的SQL看起来像这样:
SELECT COUNT(*) AS `count`
FROM `products` AS `Product`
WHERE 1 = 1;
SELECT `Product`.`*`
FROM `products` AS `Product`
WHERE 1 = 1
ORDER …Run Code Online (Sandbox Code Playgroud) cakephp has-and-belongs-to-many paginate containable cakephp-1.3
我正在尝试从2级深度的模型中检索特定字段.我使用容器行为,但没有正确检索底层.
下面是代码:
$this->Review->Behaviors->attach('Containable');
$latestReviews = $this->Review->find('all', array(
'contain' => array(
'Business' => array(
'fields' => array('Business.name'),
'BusinessType' => array(
'fields' => array('BusinessType.url')
)
),
),
'fields' => array('overall'),
));
Run Code Online (Sandbox Code Playgroud)
它返回的数组:
array(
(int) 0 => array(
'Review' => array(
'overall' => '2'
),
'Business' => array(
'name' => 'Business Name',
'business_type_id' => '1',
'id' => '2012'
)
))
Run Code Online (Sandbox Code Playgroud)
但是,不是给我业务类型ID,而是希望它返回BusinessType url字段.
任何人都可以看到我错在哪里?我确定这与CakePHP文档一致.
我需要你的帮助我正在使用localhost中的CakePHP开发一个网站,但当我尝试上传到服务器时我得到这个错误缺少行为
Run Code Online (Sandbox Code Playgroud)Error: containableBehavior could not be found. Error: Create the class containableBehavior below in file: app/Model/Behavior/containableBehavior.php
<?php
class containableBehavior extends ModelBehavior {
}
Run Code Online (Sandbox Code Playgroud) containable ×11
cakephp ×10
cakephp-2.0 ×3
php ×3
cakephp-1.3 ×2
belongs-to ×1
cakephp-1.2 ×1
has-many ×1
model ×1
mysql ×1
paginate ×1
recursion ×1