2016-01-01 8 views
3

У меня есть следующий метод в моем классе user:Laravel 5,2 красноречивое название колонки конфликт

/** 
* Get all organisations for user (if owner) 
* 
* @param 
*/ 
public function getOrganisationsOwned() 
{ 
    // If the user is owner of any one or many organisations then return this list 
    return Organisation::leftJoin('subscription_plans', 'organisations.subscription_plan_id', '=', 'subscription_plans.id') 
     ->where('organisations.owner_id', '=', $this->id) 
     ->select('organisations.*', 'subscription_plans.*') 
     ->get(); 

} 

метод по существу запросов и соединяет две таблицы. Каждая таблица имеет столбец title.

Выход из вышеизложенного генерирует строки по мере необходимости с правой информацией, но возвращает только один столбец title, из правой таблицы (subscription_plans), но не столбец title из левой таблицы (organisations). Я также замечаю, что также отбрасывает временные метки из одной таблицы, так как они имеют одинаковое имя столбца.

я понял, что

->select('organisations.*', 'subscription_plans.*')

бы сделать запрос возвращал обе колонки. Что мне не хватает? С новым годом!

PS: ниже копия dd() содержание для коллекции, с title только один раз.

#attributes: array:44 [▼ 
    "id" => 1 
    "title" => "Monthly Subscription" 
    "address_1" => "34 Florence Street" 
    "address_2" => "" 
    "suburb" => "Hornsby" 
    "state" => "NSW" 
    "postcode" => "2077" 
    "country_id" => 12 
    "currency_id" => 12 
    "time_zone_id" => 109 
    "phone" => "0392144497" 
    "website" => "http://www.Tremblay.com/est-aspernatur-et-ut-provident.html" 
    "business_id" => "82297955560" 
    "tax_registration" => 1 
    "logo" => "8aa656de-2bc2-4e14-dddd-e02fbcd2b76f" 
    "quote_terms_days" => 14 
    "invoice_terms_days" => 14 
    "fiscal_start_id" => 7 
    "industry_id" => 4 
    "company_size_id" => 3 
    "date_format_id" => 2 
    "date_time_format_id" => 20 
    "owner_id" => 1 
    "gateway_id" => "1" 
    "gateway_username" => "xxx" 
    "gateway_password" => "xxx" 
    "gateway_signature" => "xxx" 
    "gateway_accepted_cards" => "[1, 2, 3]" 
    "subscription_plan_id" => 1 
    "trial_ends_at" => "2015-11-07" 
    "grace_ends_at" => "2016-02-10" 
    "subscription_ends_at" => "2016-01-11" 
    "latitude" => "-33.70433500" 
    "longitude" => "151.10161900" 
    "registration" => "done" 
    "deleted_at" => null 
    "created_at" => "2016-01-01 14:59:47" 
    "updated_at" => "2016-01-01 14:59:47" 
    "amount" => "9.09" 
    "gst" => "0.91" 
    "gst_amount" => "10.00" 
    "billing_cycle" => "MONTH" 
    "trial_period_days" => 30 
    "grace_period_days" => 30 
    ] 

«отсутствующий» title колонка содержит:

'title' => 'ABC Electrical' 
+0

Как вы знаете, что запрос не возвращает оба столбца? Как вы попытались получить 2 столбца? – Shadow

+0

Я делаю 'dd()' и проверяю содержимое коллекции. заголовок столбца появляется только один раз. Как я выбираю столбцы в запросе выше. – TheRealPapa

+0

Я предполагаю, что запрос извлекает оба столбца заголовка (получает строку sql и вставляет ее в ваше избранное приложение управления mysql и выполняет его), но когда результаты преобразуются в массив php где-то, одно и то же имя вызывает переназначение 2 столбца к одному и тому же ключу, поэтому значение из правой таблицы переопределяет значение из левой таблицы. Я бы использовал var_dump() для результатов, чтобы узнать, что действительно было извлечено. Вместо использования * вы можете перечислить имена полей один за другим и предоставить псевдонимы для двух полей заголовка. – Shadow

ответ

-1

@ предложение Shadow работал, хотя я до сих пор недоумевают, как я предваряя каждый * с именем таблицы. Ниже теперь работает:

public function getOrganisationsOwned() 
{ 
    // If the user is owner of any one or many organisations then return this list 
    return Organisation::leftJoin('subscription_plans', 'organisations.subscription_plan_id', '=', 'subscription_plans.id') 
     ->where('organisations.owner_id', '=', $this->id) 
     ->select('organisations.*', 'organisations.title AS org_title', 'subscription_plans.*', 'subscription_plans.title AS plan_title') 
     ->get(); 
} 
+0

Этот комментарий является автоматическим сообщением из очереди просмотра. Этот ответ приходит в очередь просмотра сообщений низкого качества, потому что кто-то отметил это как LQ.Поскольку ваш ответ - комментарий к Теневому ответу (который должен быть принят, поскольку он отвечает на проблему ** первоначально **, указанную в вашем вопросе), он должен был быть записан в комментарии к его сообщению. И мне не скучно в жизни, спасибо. – vard

1

Существует некоторое недопонимание относительно того, что я предложил: вместо того, чтобы использовать *, вы можете перечислить имена полей по одному и предоставить псевдонимы для 2 названия полей. Это не означает, что вы должны сохранить 'organisations.*', 'subscription_plans.*' и добавить два поля заголовка в список выбора с помощью псевдонимов, так как вы дважды выбираете оба заголовка, теряя память и время процессора.

Вы не должны включать в себя * формы в списке выбора, но список каждого поля в отдельности, с 2 названия поля, отмеченные псевдонимами:

public function getOrganisationsOwned() 
{ 
    // If the user is owner of any one or many organisations then return this list 
    return Organisation::leftJoin('subscription_plans', 'organisations.subscription_plan_id', '=', 'subscription_plans.id') 
     ->where('organisations.owner_id', '=', $this->id) 
     ->select('organisations.id', 'organisations.title AS org_title', ..., 'subscription_plans.subscription_plan_id', 'subscription_plans.title AS plan_title', ...) 
     ->get(); 
} 

Да, я знаю, перечисляя так много поле один за другим это боль в ***, однако каждое поле извлекается один раз и только один раз, при этом ясно, что вы выбираете то, что нужно.

+0

Привет @Shadow, получил его, но есть много полей для списка. В SQL работает 'TableA. *', 'TableB. *', Поэтому я до сих пор не понимаю, почему он не работает в этом случае. – TheRealPapa

+0

@ TheRealPapa Я немного исследовал Google и придумал следующую тему в журнале проблем laravel: https://github.com/laravel/framework/issues/2333, по-видимому, это результат преднамеренного дизайнерского решения в laravel. – Shadow

+0

@ TheRealPapa, однако, мне показалось немного смешным то, что для экономии около 5 минут при кодировании вы готовы дважды извлечь два поля, чтобы обойти «функцию выделения» в выбранном вами ORM ... – Shadow