【问题标题】:Laravel 4 Many to Many with Eloquent and checkboxesLaravel 4 多对多与 Eloquent 和复选框
【发布时间】:2013-09-15 08:11:21
【问题描述】:

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

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

你可以在这里查看代码on 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

【问题讨论】:

  • 您是否在页面上显示所有服务,并且您想选中当前用户选择的复选框?或者,您是否只在页面上显示当前用户选择的服务?
  • @msturdy 我将显示所有服务,我想检查所选择的复选框。

标签: database laravel many-to-many laravel-4 eloquent


【解决方案1】:

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

一种方法是将第二个集合发送到用户服务的页面,然后使用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

【讨论】:

  • 它工作!现在唯一的问题是为所选服务设置价格:S
  • 呵呵,幸运儿! :)
【解决方案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 

希望对你有所帮助

【讨论】:

  • Auth::user() 是处理“用户”的登录用户,就像管理员一样。
  • 啊,我明白了,所以您需要将此 Auth::user() 更改为您要验证服务的任何其他用户的实例。我的意思是,如果您想检查具有某些 id 的用户的服务,请将其更改为 User::find($id_of_the_user_u_want)。我编辑了我的答案以包含您的评论
  • 现在唯一的问题是设置所选服务的价格:S
  • “设置价格”是什么意思,要打印出服务价格作为输入的默认值?
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2013-02-04
    • 2013-04-24
    • 2013-04-29
    • 2013-05-15
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    相关资源
    最近更新 更多