【问题标题】:How to get associated table's rows in eager loading: Laravel 5.1如何在急切加载中获取关联表的行:Laravel 5.1
【发布时间】:2017-08-11 19:21:21
【问题描述】:

我有三个数据库表。

CREATE TABLE `tblproject` (
  `ProjectID` int(11) NOT NULL,
  `ProjectStatusID` varchar(30) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

CREATE TABLE `tblprojectSkills` (
  `ProjectSkillID` int(11) NOT NULL,
  `ProjectID` int NOT NULL,
  `SkillID` int NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

CREATE TABLE `tblSkills` (
  `SkillID` int(11) NOT NULL,
  `Skill` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

在上面的表格中。 SkillIDtblSkillstblprojectSkills 相关。 ProjectIDProjectprojectSkills 表相关

我的项目模型如下。

class Project_Model extends Model
{
    protected $table = "tblproject";
    protected $primaryKey = "ProjectID";
    public $timestamps = false;

    public function ProjectSkills() {
        return $this->hasMany('\App\Models\ProjectSkill_Model', 'ProjectID');
    }        
}

class ProjectSkill_Model extends Model
{
    protected $table = "tblprojectskill";
    protected $primaryKey = "ProjectSkillID";
    public $timestamps = false;
}

class Skill_Model extends Model
{
    protected $table = "tblskill";
    protected $primaryKey = "SkillID";
    public $timestamps = false;
}

laravel 5.1 中的数据库查询如下。

\App\Models\Project\Project_Model
::with('ProjectSkills')
->where('ProjectID', '=', $ProjectID)->first();

问题

我可以获得技能 ID,但是,我如何从技能表中获取技能名称?

【问题讨论】:

标签: php laravel-5 laravel-5.1


【解决方案1】:

因此,您的验证将在每个事件中启动,focusout 等。因此,我添加了以下几行以仅在单击 button 后进行验证:

onfocusout: false,
onkeyup: false,
onclick: false,

其次,在您的CreateErrorMessage 中,我做了一些小改动,以便一次显示所有错误消息。 Message 是一个object 并且会有多个错误消息,因此它需要经过$.each

最后, 您在循环内检查ErrorMessages,理想情况下应该在循环外,这样检查只会发生一次。

以下是更新后的代码:

$(function() {
  $("form#loginForm").validate({
    onfocusout: false,
    onkeyup: false,
    onclick: false,
    rules: {
      EmailAddress: "required",
      Password: "required"
    },
    messages: {
      EmailAddress: {
        required: "Please enter email"
      },
      Password: {
        required: "Please enter Password"
      }
    },
    showErrors: function(errorMap, errorList) {
      RemoveErrorElements();
      CreateErrorMessage(errorList);
    }
  });
});

function CreateErrorMessage(errorList) {

  if ($(".panel-body").find("ul.ErrorMessages").length === 0) {
    $(".panel-body").prepend("<ul class='ErrorMessages'><ul>");
  }

  var ErrorMessages = $(".panel-body").find("ul.ErrorMessages");

  $.each(errorList, function(index, Message) {
    $(Message.element).parent().parent().addClass("has-error");
    $(Message).each(function(k, v) {
      ErrorMessages.append("<li>" + v.message + "</li>");
    })

  });
}

function RemoveErrorElements() {
  $(".panel-body").find("ul.ErrorMessages").remove();
}
<!DOCTYPE html>
<html>

<head>
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha.6/css/bootstrap.min.css">
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.17.0/jquery.validate.js"></script>
  <script src="script.js"></script>
</head>

<body>
  <div class="container">
    <div class="row">
      <div class="col-md-8 col-md-offset-2">
        <div class="panel panel-default">
          <div class="panel-heading">Login</div>
          <div class="panel-body">
            <form id="loginForm" class="form-horizontal form-label-left" novalidate="novalidate">
              <input name="_token" type="hidden" value="qZuutEkhKvETtiuA3stgpOyOiH7FrKXUPz7C7bxe">
              <div class="form-group has-error">
                <label for="EmailAddress" class="col-md-4 control-label">UserName / E-Mail Address</label>
                <div class="col-md-6">
                  <input name="EmailAddress" type="text" class="form-control">
                </div>
              </div>
              <div class="form-group has-error">
                <label for="Password" class="col-md-4 control-label">Password</label>
                <div class="col-md-6">
                  <input name="Password" type="password" value="" class="form-control">
                </div>
              </div>
              <div class="form-group">
                <div class="col-md-8 col-md-offset-4">
                  <button type="submit" class="btn btn-primary">
                                            Login
                                        </button>
                </div>
              </div>
            </form>
          </div>
        </div>
      </div>
    </div>
  </div>
</body>

</html>

【讨论】:

    【解决方案2】:
    class Project_Model extends Model
    {
        protected $table = "tblproject";
        protected $primaryKey = "ProjectID";
        public $timestamps = false;
    
        public function ProjectSkills() {
            return $this->hasMany('\App\Models\ProjectSkill_Model', 'ProjectID');
        }        
    }
    
    class ProjectSkill_Model extends Model
    {
        protected $table = "tblprojectskill";
        protected $primaryKey = "ProjectSkillID";
        public $timestamps = false;
    
    
        public function Skills() {
            return $this->hasOne('\App\Models\Skill_Model', 'ProjectSkillID');
        }
    }
    
    class Skill_Model extends Model
    {
        protected $table = "tblskill";
        protected $primaryKey = "SkillID";
        public $timestamps = false;
    }
    

    获取技能名称

    $project_info = \App\Models\Project\Project_Model->where('ProjectID', '=', $ProjectID)->first();
    
    foreach($project_info->ProjectSkills as $ProjectSkills) {
         dd($ProjectSkills->skill_name);
    }
    

    【讨论】:

      【解决方案3】:

      正如您粘贴的那样,您不需要中间表。并添加外键ProjectID 引用tblproject 表。

      像这样改变Project_Model中的关系方法:

      public function Skills() {
          return $this->hasMany('\App\Models\Skill_Model', 'ProjectID');
      }
      

      并执行查询语句:

      $project = \App\Models\Project\Project_Model::where('ProjectID', $ProjectID)->with(['Skills' => function ($query) {
          $query->addSelect(['SkillID', 'Skill', 'ProjectID']);
      }])->get();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-08
        • 1970-01-01
        相关资源
        最近更新 更多