我正在用Yii (v1.1.12)编写我的第一个应用程序,学习曲线对我来说有点陡峭,所以我需要一些帮助。
设想以下表格(及其关系):
user是保存可以登录和使用应用程序的用户的信息的表。
我已经成功地将一个列出所有文档的视图(使用Gii和黑客操作)放在一起,并且还设法在网格中显示类别名而不是类别ID。
我要实现的功能之一是允许用户切换视图,因此(a)只列出与登录用户有关的文档,或(b)只列出与他/她所在部门有关的文档。
我四处看了看,没有运气。有人能帮忙吗?
干杯,乔治
UPDATE: Currenlty我使用zii.widgets.grid.CGridView显示文档列表。
更新2:在奥马尔对CDbCriteria的引用之后,我找到了这 URL,其中包含了关于这个主题的更多细节。
我想出了以下模型代码,它运行得很好:
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代码。并不是因为懒散,而是为了更好地利用框架的功能。
我只是觉得这种方法没有遵循最佳实践(?)
发布于 2012-11-12 18:36:41
尝试创建自己的CDBCriteria,并在其中定义任何条件,并将其作为数据提供程序传递给网格视图。
如果允许在网格视图中进行搜索,则将条件传递给搜索函数,并在其中将传递的条件与搜索中的条件合并。
发布于 2012-11-12 21:57:25
你可以利用关系来达到你想要的目标。例如,要查看某个用户的所有文档和部门,首先需要为该用户设置关系,在您的情况下,您可以像这样设置用户模型;
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将成为所有用户文档的活动模型数组。
要获得用户部门的所有文档,有几个选项。您可以再次使用关系,将以下内容添加到部门模型中:
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);顺便说一下,我还没有测试过其中的任何一个,所以它们可能需要一些编辑!
发布于 2012-11-12 15:17:24
您需要在适当的模型上修改search函数(我将在documents上猜测)。您已经可以看到可以使用的代码了。
向搜索函数本身添加一些参数,这些参数可以从控制器传入。然后使用这些来确定要执行的compare调用。
https://stackoverflow.com/questions/13345949
复制相似问题