Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 27.06.2016 13:00:04

Вадим

Множественные отношения.

Доброго времени суток всем.
Ситуация такая,есть таблицы:
assist
no (primary key)

case_providers

case_no (id)
providers_code (id)

user_cards
name (varchar)
providers_code (id)
country (id) city

user_conuntries

country (id)
name (varchar)

user_cities
city(id)
country(id)
name (varchar)

Первая таблица assist - содержит информацию по случаям, user_cards - список провайдеров, case_providers - список случаев из assist с кодами провайдеров из user_cards, user_countries ,user_cities - таблицы стран и городов.
Нужно в страничке случая вывести такую форму:

@foreach ($providers as $provider)
<div class="row">
    <div class="form-group col-xs-3 col-md-3">
        <label for="policy_no">Code:</label>                       
        <input type="text" class="form-control" name="providers[]" required value="{{ $provider->code }}">
    </div>
    <div class="form-group col-xs-2 col-md-2">
        <label for="policy_id">Name:</label>                          
        <input type="text" class="form-control" value="{{ $provider->name }}" disabled>
    </div>
    <div class="form-group col-xs-2 col-md-2">
        <label for="policy_id">Country:</label>                          
        <input type="text" class="form-control" value="{{ $provider->country_name }}" disabled>
    </div>
    <div class="form-group col-xs-2 col-md-2">
        <label for="policy_id">City:</label>                          
        <input type="text" class="form-control" value="{{ $provider->city_name }}" disabled>
    </div>
</div>
@endforeach

Меня хватило на следующее:

class CaseController extends Controller {
        public function show($id) {
                $case = \App\Cases::where('no', $id)->first();
                .....
                $providers = $case::find($id)->providers;
                return view('case.case', compact('case', 'country', 'status', 'type', 'all_clients', 'providers'));
            }
        }
    class Cases extends Model {

        const UPDATED_AT = 'edit_date';
        const CREATED_AT = 'crt_date';

        protected $primaryKey = 'no';        
        protected $guarded = ['no'];
        protected $table = 'assist';

        public function providers() {
            return $this->hasMany('App\CaseProviders','case_no');
        }

    }
    class CaseProviders extends Model
    {
        //
    }

В итоге получаю форму с кодами провайдеров, как создать связи что-бы можно было выводить и остальную информацию (имя/город/страну)?

#2 27.06.2016 13:15:31

Re: Множественные отношения.

  1. $case = \App\Cases::(where(’no’, $id)->first();
  2. $providers = $case::find($id)—>providers;

Я по два раза не повторяю — не повторяю? )

Город, страна и тп — с чем связаны?

Изменено VitalN (27.06.2016 13:16:05)

Не в сети

#3 27.06.2016 14:34:04

Вадим

Re: Множественные отношения.

VitalN пишет:

}%>$case = \App\Cases::**(where('no', $id)->first()**;
> $providers = $case::**find($id)**->providers;
Я по два раза не повторяю - не повторяю? )

Город, страна и тп - с чем связаны?

)))
$providers = $case->providers; исправил )

город/страна связаны с user_cards, которая у меня пока вообще нигде не фигурирует.
Схемка примерно такая в assist порядковые номера случаев, в case_providers номер из assist и код провайдера из user_cards, далее в user_cards имя провайдера и id страны/города из user_countries/user_cities. На голом SQL мой запрос банален:

SELECT user_cards.code,user_cards.name as prov,user_cities.name as city,user_countries.name as country
                FROM case_providers,user_countries,user_cities,user_cards 
                where case_providers.code=user_cards.code and user_cards.country=user_countries.id and user_cards.city=user_cities.id and case_providers.case_no=$id

#4 27.06.2016 14:39:15

Re: Множественные отношения.

Ну насколько я понял, надо добавить 1-1 между case_providers- user_cards
А от user_card belongsTo к городу и стране

При выборке делаешь with()
Потом что-то типа

$provider → user_card → country->name

Изменено VitalN (27.06.2016 14:40:11)

Не в сети

#5 27.06.2016 16:52:31

Вадим

Re: Множественные отношения.

VitalN пишет:

}%Ну насколько  я понял, надо добавить 1-1 между case_providers- user_cards
А от  user_card  belongsTo к городу и стране

При выборке делаешь with()
Потом что-то типа

$provider -> user_card -> country->name

Добавил:

namespace App;

use Illuminate\Database\Eloquent\Model;

class CaseProviders extends Model {

    public function ProvName() {
        return $this->hasOne('App\Providers', 'code');
    }

}

и во вьюшку

 <input type="text" class="form-control" value="{{ $provider->ProvName }}" disabled>

в логах вижу вот такое:

2016-06-27T13:43:12.623407Z  367 Prepare        select * from `user_cards` where `user_cards`.`code` is null and `user_cards`.`code` is not null limit 1
2016-06-27T13:43:12.623540Z  367 Execute        select * from `user_cards` where `user_cards`.`code` is null and `user_cards`.`code` is not null limit 1
2016-06-27T13:43:12.624018Z  367 Close stmt
2016-06-27T13:43:12.624489Z  367 Prepare        select * from `user_cards` where `user_cards`.`code` is null and `user_cards`.`code` is not null limit 1
2016-06-27T13:43:12.624626Z  367 Execute        select * from `user_cards` where `user_cards`.`code` is null and `user_cards`.`code` is not null limit 1
2016-06-27T13:43:12.625075Z  367 Close stmt
2016-06-27T13:43:12.625541Z  367 Prepare        select * from `user_cards` where `user_cards`.`code` is null and `user_cards`.`code` is not null limit 1
2016-06-27T13:43:12.625664Z  367 Execute        select * from `user_cards` where `user_cards`.`code` is null and `user_cards`.`code` is not null limit 1
2016-06-27T13:43:12.626110Z  367 Close stmt
2016-06-27T13:43:12.626575Z  367 Prepare        select * from `user_cards` where `user_cards`.`code` is null and `user_cards`.`code` is not null limit 1
2016-06-27T13:43:12.626699Z  367 Execute        select * from `user_cards` where `user_cards`.`code` is null and `user_cards`.`code` is not null limit 1

может уже от жары так туплю, но не понимаю почему такие запросы ОоО, без привязки к коду из case_providers, да и еще на полную выборку, хотя в данном случае нужен бы только name ...

#6 27.06.2016 17:15:45

Re: Множественные отношения.

Так полная выборка и будет )
public function ProvName() {
return $this->hasOne(’App\Providers’, ’code’);
}
вернет тебе весь объект типа App\Providers
у которого поле code == id текущей модели (CaseProviders)

Я чесгря, в случаях, когда нужна хитропопая выборка по многим связанным таблицам юзаю прямые селекты, так больше контроля над тем что делаешь )

По отношениям почитай перевод документации, если не читал еще
https://laravel-news.ru/blog/tutorials/eloquent-relation

Не в сети

Подвал раздела