2

我正在尝试使用 Laravel 4 解决我的应用程序的问题。问题在于 Eloquent 和 M:M 关系。

这是我的情况:我有很多用户可以选择很多服务,他们可以为每项服务提供专门的价格。在数据库中,我有名为“services”、“users”和“users_services”的表。所以目前我可以保存每个用户选择的服务和价格但我的问题是我不知道如何检索并将它们展示给用户,我的意思是我不知道如何设置“检查”每个选定服务的复选框以及每项服务的价格。

您可以在 Paste Laravel 上查看代码以获取任何分叉。我也贴在这里。

    <?php

class Service extends Eloquent {

    public static $rules = array();

    protected $guarded = array('id');

    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'services';

    /**
     * -------------------------------------
     * All Joins w/ other tables
     * -------------------------------------
     **/
    public function users()
    {
        return $this->belongsToMany('User','users_services','services_id','user_id');
    }
}

......

<?php

class User extends Eloquent {

    public static $rules = array();

    protected $guarded = array('id');

    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'users';

    /**
     * -------------------------------------
     * All Joins w/ other tables
     * -------------------------------------
     **/
    public function services()
        {
            return $this->belongsToMany('Service','users_services','user_id','service_id');
        }       
}

................

// Inside the controller 

$services = Service::all();
$this->layout->content = View::make('private.user.services')->with(compact('services'));

...............

// The view
@foreach($services as $service)
 <div class="pull-left col-lg-6 service-container">
  <div class="checkbox pull-left">
   <label>
    <input type="checkbox" name="services[]" value="{{ $service->id }}"><span>{{ $service->name }}</span>
   </label>
  </div>
  <div class="input-group service-price pull-right">
  <input type="number" min="0" name="prices[{{$service->id}}]" class="form-control pull-rigth" placeholder="0">
   <span class="input-group-btn">
    <button class="btn btn-default" type="button" disabled><i class="icon-eur"></i></button>
   </span>
  </div>
 </div>
@endforeach
4

3 回答 3

5

在您看来,当您遍历所有可能的服务时,您需要检查当前用户是否选择了该服务。

一种方法是将第二个集合发送到用户服务的页面,然后使用该contains()方法检查它。

在您的控制器中,将用户关系中的服务拉入一个新变量中:

$services      = Service::all();
$user_services = $user->services;
$this->layout->content = View::make('private.user.services')->with(compact('services'))->with('user_services', $user_services);

在您看来,只需将选中的属性添加到复选框..

@foreach($services as $service)
 <div class="pull-left col-lg-6 service-container">
  <div class="checkbox pull-left">
   <label>
    <input type="checkbox" name="services[]" value="{{ $service->id }}" @if( $user_services->contains($service->id) ) selected@endif><span>{{ $service->name }}</span>
   </label>
  </div>
  <div class="input-group service-price pull-right">
  <input type="number" min="0" name="prices[{{$service->id}}]" class="form-control pull-rigth" placeholder="0">
   <span class="input-group-btn">
    <button class="btn btn-default" type="button" disabled><i class="icon-eur"></i></button>
   </span>
  </div>
 </div>
@endforeach

注意,它没有经过测试,我不知道模型之间的关系..但应该没问题:)

(请注意,您的一门课程中有错字.. pull-rigth

于 2013-09-11T13:37:08.050 回答
2

这应该适合你

1)在控制器中,存储与某些用户(当前登录的用户?)相关的服务列表,然后将它们传递给视图

 // ... get some $user
 $some_users_services = $user->related()->lists('service_id');
 // ... view make stuff etc.

2)在您看来,在生成复选框列表时,检查它是否与用户选择的服务(相关服务ID)匹配

 @if( in_array($service->id, $some_users_services) ) checked="checked" @endif 

希望这可以帮助你

于 2013-09-11T13:46:24.383 回答
0

msturdy 的回答非常好,但对于复选框,我会使用“选中”而不是“选中”。除此之外,它工作得很好。谢谢!

于 2014-12-15T18:41:14.760 回答