Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Доброго времени суток всем.
Ситуация такая,есть таблицы:
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
{
//
}
В итоге получаю форму с кодами провайдеров, как создать связи что-бы можно было выводить и остальную информацию (имя/город/страну)?
Не в сети
}%>$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
Не в сети
}%Ну насколько я понял, надо добавить 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 ...
Так полная выборка и будет )
public function ProvName() {
return $this->hasOne(’App\Providers’, ’code’);
}
вернет тебе весь объект типа App\Providers
у которого поле code == id текущей модели (CaseProviders)
Я чесгря, в случаях, когда нужна хитропопая выборка по многим связанным таблицам юзаю прямые селекты, так больше контроля над тем что делаешь )
По отношениям почитай перевод документации, если не читал еще
https://laravel-news.ru/blog/tutorials/eloquent-relation
Не в сети
Страницы 1