2011-12-30 3 views
0

У меня есть две таблицы: пользователи и профили. Пользователь может иметь профиль, а профиль должен иметь пользователя!CakePHP найти запись, которая соответствует двум таблицам

Таблицы:

Пользователи: ID имя пользователя электронной пароль

Профили: Firstname Lastname пол д.р. user_id

Итак, как вы можете видеть ссылки таблицы профилей обратно пользователям с помощью ключа user_id

Как просмотреть профиль на основе имени пользователя этого пользователя?

Как нужно извлекать информацию из обеих таблиц ... до сих пор у меня есть:

public function view ($username) 
{ 
    $profile = $this->Profile->find('first', array(
       'conditions' => array('User.username' => $username) 
      )); 

    if (empty($profile)) 
    { 
     $this->cakeError('error404'); 
    } 

    $this->set(compact('profile')); 
} 

и это маршрут для него:

Router::connect('/people/:userName',array('controller'=>'profiles','action'=>'view'), 
    array(
     'userName'=>'[A-Za-z0-9\._-]+', 
     'pass'=>array('userName') 
    ) 
); 

Также здесь являются модели:

Пользователь:

class User extends AppModel 
{ 
    var $name = 'User'; 
} 

Я не указал пользователя hasOne профиля, так как у пользователя может не быть профиля. например учетной записи администратора

Профиль:

class Profile extends AppModel 
{ 
    var $name = 'Profile'; 

    var $belongsTo = 'User'; 
} 

и вот мое мнение:

<h1><?php echo $profile['Profile']['firstname']; ?> <?php echo $profile['Profile']['lastname']; ?></h1>

Но нужно немного порулить, чтобы получить его правильно. Согласно книге CakePHP 2.0 я могу сделать что-то вроде: $this->User-Profile->, но я не совсем понимаю это или как я могу использовать его здесь ???

Например это было бы правильно:

$profile = $this->Profile->User->find('first', array( 'conditions' => array('User.username' => $username) ));

Благодаря

+1

настроить отношения '$ hasOne'. Это не значит, что вы * обязательно * имеете профиль, но можете иметь только профиль * one *. Затем вы можете получить доступ к данным через ассоциации ('$ this-> User-> Profile ') – Ross

ответ

1

По своим маршрутам, вы собираетесь использовать модель 'User' от ProfilesController.Для этого, чтобы работать, вы должны добавить после class ProfilesController extends Controller следующую строку:

public $uses = array('User','Profile');

Тогда вы получите непосредственно модель пользователя, как это:

$this->User->...

Я могу ошибаться, но я не думаю, что вы могли бы сделать $this->Profile->User

[EDIT:]

после обсуждения этого, появится модель Пользователь должен действительно иметь $hasOne='Profile';

Потому что не навязывает профиль, но просто получить его из базы данных, если она когда-либо существует.

+0

Хорошо, но, на мой взгляд, я получаю сообщение об ошибке:' Undefined index: Profile [APP/View/Profiles/view.ctp, строка 1] 'Добавлено мой код просмотра в OP – Cameron

+0

@Cameron это нормально, потому что индексы изменились. Просто 'debug ($ data)' и исправить ваш взгляд соответственно –

+0

Извините, что я не следую. В чем проблема с индексом? – Cameron

Смежные вопросы