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();

?>

Пожалуйста, помогите мне решите эту проблему. Большое спасибо!!!

Author: Kame, 2014-04-23

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.

Вы можете найти его в документах .

 10
Author: majidarif, 2014-04-23 05:08:53

Пожалуйста, попробуйте:

<?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 читайте здесь

 3
Author: Paul Bele, 2014-04-23 04:56:23