我正在用 Yii(v1.1.12)撰写我的第一个应用程序,学习曲线对我来说有点陡峭,所以我需要一些帮助。
想象一下下面的表(及其关系):
user
是保存有关可以登录和使用该应用程序的用户的信息的表。
我已经设法(使用 Gii 和黑客攻击)一个列出所有文档的视图,并且还设法在网格中显示类别名称而不是类别ID。 / p>
我想要实现的功能之一是允许用户切换视图,以便(a)仅列出与登录用户相关的文档,或者(b)仅显示与他/她的部门相关的文档。
我没有运气地环顾四周。有人可以帮忙吗?
干杯, 乔治
更新:Currenlty我使用zii.widgets.grid.CGridView
显示文档列表。
更新2:
根据Omar对CDbCriteria
的引用,我找到了this网址,其中详细介绍了该主题。
我想出了以下型号代码,效果很好:
public function searchByUser($user_id)
{
$criteria=new CDbCriteria;
$criteria->condition = " user_id = ".$user_id;
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
));
}
public function searchByDepartment($user_id)
{
$criteria=new CDbCriteria;
$criteria->alias="p";
$criteria->join = "JOIN (SELECT u.id
FROM user u
INNER JOIN user uu
ON u.department_id = uu.department_id
WHERE uu.id = ".$user_id.") uu
ON p.user_id = uu.id";
return new CActiveDataProvider($this, array('criteria'=>$criteria,));
}
虽然上面的工作符合预期,但我希望找到一个不需要我编写切碎的SQL代码的解决方案。不是因为懒惰,而是为了利用框架的更多功能。
我只是觉得这种方法并没有遵循最佳实践(?)。
答案 0 :(得分:2)
尝试创建自己的CDBCriteria
并定义其中的任何条件,并将其作为数据提供者传递给网格视图。
如果您允许在网格视图内进行搜索,请将条件传递给搜索功能,并在其中将已通过的条件与搜索中的条件合并。
答案 1 :(得分:2)
您可以使用关系来实现您所追求的目标。例如,要查看某个用户的所有文档和部门,首先需要为该用户设置relations,在您的情况下,您可以设置用户模型;
public function relations()
{
return array(
'documents' => array(self::HAS_MANY, 'Document', 'user_id'),
'department' => array(self::HAS_ONE, 'Department', 'department_id'),
);
}
然后,您可以为当前用户提取所有文档,如下所示:
$user = User::model()->findByPk($userId);
$documents = $user->documents;
$documents
将成为所有用户文档的活动模型数组。
要获取该用户部门的所有文档,有几个选项。您可以再次使用关系,向Department模型添加以下内容:
public function relations()
{
return array(
'users' => array(self::HAS_MANY, 'User', 'department_id'),
'documents' => array(self::HAS_MANY, 'Document', 'document_id', 'through'=>'users'),
);
}
这应该让你能够拉出所有部门文件;
$department = Department::model()->findByPk($departmentId);
$documents = $department->documents;
这反过来意味着您可以抓住用户部门文档,如下所示:
$user = User::model()->findByPk($userId);
$documents = $user->department->documents;
通过在“用户”模型中使用关系,可能有一种更有效的方法来抓取它们,但是现在为我工作已经为时已晚;)
一旦有了一系列活动记录模型,您可以使用CArrayDataProvider这样的方式将它们传递给数据提供者;
$dataprovider = new CArrayDataProvider($documents);
顺便说一句,我没有测试过这些,所以他们可能需要进行一些编辑!
答案 2 :(得分:0)
您需要修改相应模型上的search
函数(我将猜测documents
)。您已经可以在那里看到可以使用的代码了。
向搜索功能本身添加一些参数,可以从控制器传入。然后使用这些来确定要进行的compare
次调用。