CakePHP находит запись, которая совпадает в двух таблицах - PullRequest
0 голосов
/ 30 декабря 2011

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

Таблицы:

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

Профили: имя, фамилия, пол dob 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 Ответ

1 голос
/ 30 декабря 2011

В зависимости от ваших маршрутов вы будете использовать модель «Пользователь» из ProfilesController. Чтобы это работало, вы должны добавить после class ProfilesController extends Controller следующую строку:

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

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

$this->User->...

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

[РЕДАКТИРОВАТЬ:]

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...