【问题标题】:CakePHP Parent_ID NameCakePHP Parent_ID 名称
【发布时间】:2013-01-23 01:09:12
【问题描述】:

我的数据库

学生桌

ID    NAME     PARENT_ID (VARCHAR)
1     JOHN     NULL
2     MATT     NULL
3     PETER    1,2

在表格列表中显示

ID    NAME     MENTOR NAME
1     JOHN     NULL
2     MATT     NULL
3     PETER    JOHN, MATT

在创建 for each 循环以显示表格中的数据列表时,如何显示“John and Matt”而不是“1,2”?

我在 $belongTo 中的 Student Class 中有一个 StudentExtra,用于显示导师姓名。但是,此方法只显示一个导师姓名。

型号

class Student extends AppModel
{
// Mainly for PHP4 users
var $name = 'Student';
var $hasMany = array('Order','Test'); 

var $belongsTo = array
(
'StudentExtra'=>array
(
   'className'  => 'Student',
   'foreignKey' => 'parent_id'
),'School','Classroom'
);

控制器

    $this->paginate = array(
            'limit' => 10,
        'order' => array('Student.name' => 'ASC'));

    $this->set('students', $this->paginate('Student'));

查看

<table>
<?php foreach ($students as $student){ ?>
<tr> 
<td>
<?php $student['Student']['id'] ?>
</td>
</tr>
<tr> 
<td>
<?php $student['Student']['name'] ?>
</td>
</tr>
<tr> 
<td>
<?php $student['Student']['parent_id'] ?>
</td>
</tr>
<?php } ?>
</table>

结果

 Array
 (
  [0] => Array
    (
        [Student] => Array
            (
                [id] => 1190
                [customers_gender] => M
                [resumetest] => 
                [created] => 2013-04-01 19:29:08
                [modified] => 2013-04-01 19:29:08
                [customers_name] => aaa aaa
                [customers_dob] => 1970-01-01
                [customers_roles] => student
                [customers_types] => student
                [customers_parent_id] => 1055,1056
                [school_id] => 40
                [classroom_id] => 96
            )

        [StudentExtra] => Array
            (
                [id] => 1055
                [customers_gender] => F
                [created] => 2013-03-28 11:14:25
                [modified] => 2013-03-28 11:14:25
                [customers_name] => Mich
                [customers_dob] => 1970-01-01
                [customers_roles] => teacher
                [customers_types] => teacher
                [customers_parent_id] => 
                [school_id] => 40
                [classroom_id] => 96
            )

        [School] => Array
            (
                [id] => 40
                [name] => Primary School
                [description] => 
                [created] => 2013-03-28 10:47:05
                [modified] => 2013-03-28 10:47:05
            )

        [Classroom] => Array
            (
                [id] => 96
                [name] => 30G
                [year_level] => 3
                [description] => 
                [created] => 2013-03-28 10:58:25
                [modified] => 2013-03-28 10:58:25
                [school_id] => 40
            )

        [Order] => Array
            (
            )

        [Test] => Array
            (
            )

    )

【问题讨论】:

  • 我有点困惑。您使用的是 CakePHP 1.3、1.2 还是 2.1?有很大的不同,你只是包含了每个标签......

标签: php cakephp cakephp-1.3 cakephp-1.2


【解决方案1】:

其他 cakephp 方式如下。

您还可以将关联设置为学生模型,如下所示。

学生模型中添加以下代码

var $belongsTo = array
(
    'StudentExtra'=>array
    (
       'className'  => 'Student',
       'foreignKey' => 'parent_id'
    )
);

在控制器中

$this-&gt;set('students', $this-&gt;paginate('Student'));

现在只需执行pr($students); exit(); 即可在视图中或控制器功能结束时测试结果。

您将看到 StudentExtra 的额外附加记录数组,这就是您所需要的。

现在在视图文件中显示如下。

<table>
    <?php foreach ($students as $student){ ?>
    <tr> 
        <td>
            <?php $student['Student']['id'] ?>
        </td>
    </tr>
    <tr> 
        <td>
            <?php $student['Student']['name'] ?>
        </td>
    </tr>
    <tr> 
        <td>
            <?php $student['StudentExtra']['name'] ?>
        </td>
    </tr>
    <?php } ?>
</table>

回答更新响应代码

$this->paginate = array
(
    'joins'=>array
    (
        array
        (
            'table'=>'students',
            'alias'=>'StudentExtra',
            'type' =>'inner',
            'conditions' =>array('StudentExtra.id IN (Student.parent_id)')
        )
    ),
    'limit'=> 10,
    'order' => array('Student.name' => 'ASC')
);

$this->set('students', $this->paginate('Student'));
debug($this->paginate('Student'));
exit;

【讨论】:

  • 天啊!迪佩什 你同样棒极了!你解决了我的问题!我现在可以去睡觉了!谢谢!
  • Dipesh,如果我有两个家长 ID 关联到学生怎么办?你能帮忙吗?就像 90,20 (parent_id) -> 50 (student_id) 我需要显示两个父母的名字。
  • @user1533321 然后我会说这是不可能的,因为孩子只有一个直接的父母......就像人类一样......
  • 感谢您的回复。 Dipesh 你有什么办法解决我的问题吗?
  • @user1533321 哦,请把 StudentExtra 从 paginate join 重命名为 StudentMore 并查看
【解决方案2】:

创建学生模型:

class Students extends AppModel {

    public $useTable = false;

    public function getParentName($id) {
        $id = (int) $id;
        $sql = "
            SELECT NAME FROM `students` WHERE ID = (
                SELECT PARENT_ID FROM `students` WHERE ID = $id
            )
        ");
        return $this->query($sql);
    }

}

然后在你的控制器中:

$this->Students->getParentName(2); // in this case for Peter

【讨论】:

  • 你知道如何使用这种语句吗? $this->Student->find('all', array('conditions' => array('' = '')));
  • @user1533321,不,但我认为在这种情况下无法使用。你需要一个子查询,所以自己运行查询是最简单的方法。
  • jeffrey 不介意你能再看看我编辑的 qns 吗?你能指导我获取 parent_id 的名称而不是显示 parent_id 本身吗?
  • 非常感谢杰夫。就快到了。 SELECT name FROM 'students' WHERE ID = (SELECT parent_id FROM 'students' WHERE ID = 173) 我收到一个错误 - 您的 SQL 语法有误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 ''students' WHERE ID = (SELECT parent_id FROM 'parents' WHERE ID = ' 附近使用正确的语法
  • 我可以在视图中显示这个吗? $this->Students->getParentName(2);
猜你喜欢
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-19
  • 1970-01-01
  • 1970-01-01
  • 2016-11-26
  • 2012-08-15
相关资源
最近更新 更多