Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel First或创建关系搜索_Php_Laravel_Eloquent - Fatal编程技术网

Php Laravel First或创建关系搜索

Php Laravel First或创建关系搜索,php,laravel,eloquent,Php,Laravel,Eloquent,我想使用firstOrCreate函数的雄辩。我的数据的相关部分是属于一个国家的运动员和拥有许多运动员的国家的运动员。一对多关系 class Athlete extends Model { public $timestamps = false; protected $fillable = ['firstname', 'lastname', 'nation']; ..... public function nation() { return $this->belo

我想使用firstOrCreate函数的雄辩。我的数据的相关部分是属于一个国家的运动员和拥有许多运动员的国家的运动员。一对多关系

class Athlete extends Model
{
  public $timestamps = false;
  protected $fillable = ['firstname', 'lastname', 'nation'];
.....
  public function nation()
  {
      return $this->belongsTo('App\Nation');
  }
}

如果我还必须检查国家,我如何使用First或Create

都不是

$ath = Athlete::firstOrCreate(['nation_id'=>$nation->id, 'lastname'=>$nn, 'sex'=>$sex, 'firstname'=>$vn] );
也不是

工作

第一种情况:

国家id没有默认值

第二种情况:

Laravel尝试使用传递的对象构建WHERE语句,该语句 显然不行

我可以在这里使用First或Create吗

多谢各位

首先在$fillable protected字段中,您在与DB相关的国家字段下划线。 根据这一点,我不理解第二次尝试查询中的字段nation_id

在关系声明中,请在外键下划线,以便两个字段nation和nation_id之间的区别变得清晰

假设字段nation包含与主要唯一ID上的Nations记录匹配关系的关系,则可以比较此ID上提供的数据以进行国家比较,而不是所有国家字段上的数据

那么你报告的第一个案例我想是错的

第一种情况:国家id没有默认值

因为这意味着您在插入运动员时没有提供国家id,结果是该id没有在查询生成器中签入,可能是因为该id为null。 这样,如果nation为空,则不会显示与当前运动员和现有db运动员的比较

一般来说,我建议您执行以下步骤来完成任务:

检查传递给查询生成器的所有数据是否正确 以这种方式编写查询

$ath = Athlete::firstOrCreate(['field_that_contains_nation_id'=>$nation->id, 'other_athlete_fields' => $value, ...] );
然后运行此模型的操作

$ath->save();
如果您想知道是否创建了记录,请执行以下操作:

if($ath->wasRecentlyCreated){
    echo 'Created successfully';
} else {
    echo 'Already exist';
}
如果此操作不起作用,请检查表中的关系设置是否正确。

$fillable必须包含列名,而不是关系名。此外,性缺失:

protected $fillable = ['firstname', 'lastname', 'sex', 'nation_id'];

可能是重复的否,我之前检查过,但那是另一个问题。我的问题是如何在firstOrCreate方法中检查关系,链接的问题是如何通过关系使用findOrCreate方法。我使用标准的Laravel命名,我希望相关对象称为nation。因此,Laravel使用mysql列nation_id作为外键。在$nation变量中,我有一个对象,所以我按照您的建议尝试比较ID。我在原始问题中的第一个例子,正确的关系设置意味着什么?在我的模型中,我有关系,见原始问题。在mysql表中,我在两个表中都有一个id字段,一个国家id作为外键。所有Laravel标准命名。我不使用mysql关系,因为该关系应由laravel处理。是的,不使用sql关系,但检查表中的关系设置是否正确,我的意思是:1。明确声明laravel设置关系return$this->hasOne'App\atternate'、'foreign_key'的键;2.首先尝试通过创建一个select查询来分离FIRSTORCEATE函数完成的步骤,以查找与输入数据相等的行数,然后在该计数为0时插入查询。这允许您验证Laravel是否正确识别该关系。
if($ath->wasRecentlyCreated){
    echo 'Created successfully';
} else {
    echo 'Already exist';
}
protected $fillable = ['firstname', 'lastname', 'sex', 'nation_id'];