Laravel - Объединение с таблицей с составным первичным ключом
Моя проблема состоит в том, чтобы объединить 2 таблицы в рамках Laravel. Один из них таблица динамических имен (это переменная), а второй имеет составной первичный ключ . Я должен использовать конструктор запросов вместо where(). Пожалуйста, просмотрите мои следующие сведения для получения подробной информации:
У меня есть 2 таблицы:
CREATE TABLE `details` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`source_id` int(10) unsigned NOT NULL,
`brand_id` int(10) DEFAULT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `links` (
`source_id` int(10) unsigned NOT NULL,
`brand_id` tinyint(3) unsigned NOT NULL DEFAULT '1',
PRIMARY KEY (`source_id`,`brand_id`)
);
Теперь мне нужно объединить 2 эти таблицы, я использую этот код:
<?php $results = \DB::table('details')
->join('links', function($join)
{
$join->on('details.source_id', '=', 'links.source_id');
$join->on('details.brand_id','=', 'links.brand_id');
})
->get();?>
Присоединиться к этой таблице довольно просто, хорошо. Но моя проблема в том, что имя таблицы является динамическим.
<?php
$type = Input::get('type', null);
$table = $type . '_details';
$results = \DB::table($table)
->join('links', function($join)
{
// the following code will show errors undefined $table
$join->on($table . '.source_id', '=', 'links.source_id');
$join->on($table . '.brand_id','=', 'links.brand_id');
})
->get();
?>
Пожалуйста, помогите мне решите эту проблему. Большое спасибо!!!
2 answers
Вам нужно импортировать переменные из локальной области в область анонимной функции, вот как:
$results = \DB::table($table)
->join('links', function($join) use ($table)
{
$join->on($table . '.source_id', '=', 'links.source_id');
$join->on($table . '.brand_id','=', 'links.brand_id');
})
->get();
Обратите внимание на строку:
->join('links', function($join) use ($table)
Проблема в том, что анонимная функция не знает о переменной $table
, поэтому вы сообщаете ей о переменной, используя use
.
Пожалуйста, попробуйте:
<?php
$type = Input::get('type', null);
$table = $type . '_details';
$joinFunction = function($join) use ($table)
{
$join->on($table . '.source_id', '=', 'links.source_id');
$join->on($table . '.brand_id','=', 'links.brand_id');
}
$results = \DB::table($table)
->join('links',$joinFunction )
->get();
?>
Проблема заключалась в том, что функция не видит внутри себя переменную $table. Вот почему вам нужно использовать инструкцию "использовать".
Подробнее об анонимных функциях в php читайте здесь