Select с inner join с CakePHP
Я с этой проблемой на некоторое время в отношении проекта, который я разрабатываю cakephp", "моя view" не может читать select inner join таблицы.
Controller:
public function initialize()
{
$posts = $this->Posts->find("all",array(
"joins" => array(
array(
"table" => "users",
"alias" => "User",
"type" => "INNER",
"conditions" => array("Post.user_id = User.id "),
"fields" => array('Post.*', 'User.username')
)
)
)
);
Model;
public function initialize(array $config) {
$this->addBehavior('Timestamp');
$this->displayField('title');
//join
$this->belongsTo('User');
}
View
<?= $post->username ?>
Код SQL
SELECT posts.*,
users.username
FROM posts
INNER JOIN users
ON ( posts.user_id = users.id )
, Объясняя лучше, этот запрос ищет "username" таблицы A в таблицу B, причем эта таблица B мой view может сделать чтение обычно. С этой select мой банк приносит запрос именно то, что мне нужно, но моя view не показывает результат, и возвращает null. Или говорит, если я попытаюсь сделать каналы так: $post->users->username, возвращает ошибку, что не находит объекта users.
2 answers
JOIN's
CakePHP помещает значения в соответствующих объектов.
, Скорее всего, ваш username
находится внутри объекта User
:
$post->user->username
Дайте pr()
объекта $post
, чтобы он отображал все атрибуты.
Вместо sql
чисто, вы могли бы использовать свойства belongsTo()
, hasMany()
hasOne()
CakePHP.
Вам нужно сделать запрос в controller и установить переменную, чтобы она существует в вашей view.
Controller
$posts = $this->loadModel('Posts');
$all = $posts->find('all');
$this->set('posts', $all);
Model Должности - с Помощью belongsTo()
class PostsTable extends Table
{
public function initialize(array $config)
{
$this->belongsTo('Users');
}
}
Если вы еще не создали свои модели, проверьте этот ссылке
Если кто-то понадобится разрешение, может сделай его, добавив этот код в PostsController.
public function index()
{
$posts = $this->Posts->find('all', [
'conditions' => ['Posts.online !=' => -1]])->order(['Posts.publication' => 'DESC'])->contain(['Users']);
$this->set(compact(['posts']));
}
Model
public function initialize(array $config) {
//funcao para trazer username do inner join
$this->addBehavior('Timestamp');
$this->displayField('title');
$this->belongsTo('Users', [
'foreignKey' => 'user_id',
'joinType' => 'INNER',
]);
}