Получить Specifi c Столбцы в отношении HasOne в Laravel Eloquent - PullRequest
0 голосов
/ 18 февраля 2020

Редактировать: Обновлено в hasOne в обоих классах

У меня есть две таблицы, Store и Address. Один магазин имеет один адрес, а один адрес связан только с одним магазином.

В моей модели Store у меня есть отношение hasOne.

public function store_address(): HasOne
{
    return $this->hasOne(Address::class, 'id', 'address_id');
}

И в Address У меня есть модель hasOne:

public function store(): HasOne
{
    return $this->hasOne(Store::class, 'id', 'store_id');
}

Теперь я хочу объединить эти две таблицы, используя Eloquent с () с select * из store, но хочу указать c столбцы из address Таблица.

Store::where('user_id', $user_id)
      ->select(\DB::raw('*')
      ->with(['store_address' => function($query) {
          return $query->select(['distance_to_user as distance']);
      }])
      ->orderBy('distance');

Однако он не возвращает правильный distance из таблицы адресов. Как я могу это сделать?

Это сообщение об ошибке, которое я получаю:

Column not found: 1054 Unknown column 'distance' in 'order clause' (SQL: select *, from `store` where `store`.`user_id` = 12 and `store`.`deleted_at` is null order by `distance` asc)

1 Ответ

0 голосов
/ 18 февраля 2020

Я предполагаю структуру ваших таблиц

Адреса:

id | store_id| body | distance_to_user
----------------------------------------
 1 | 1       |China | 100

и для магазинов:

id | name
--------------
 1 | Store_01

У вас должны быть такие модели, как:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Address extends Model
{
    //

    public function store()
    {
        return $this->belongsTo('App\Store');
    }
}

и

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Store extends Model
{
    //
    public function address()
    {
        return $this->hasOne('App\Address');
    }
}

теперь в вашем контроллере:

        public function index()
        {
            //return Store::with(['address' => function($q){
            //    $q->select('distance_to_user as distance','store_id');
            //    }])->get();


            return Store::leftJoin('addresses', 'addresses.store_id', '=', 'stores.id')


                 ->select('stores.id','stores.name','distance_to_user as distance')

                // OR use ->select('stores.*','addresses.id as address_id','distance_to_user as distance')

                ->orderBy('distance','Desc')

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