我有Task
模型。我的Task
模型有一些关系,它目前看起来像这样:
class Task extends Model
{
use HasFactory;
public $timestamps = false;
public function city()
{
return $this->hasOne(City::class, 'id', 'city_id');
}
public function type()
{
return $this->hasOne(Type::class, 'id', 'type_id');
}
public function note()
{
return $this->hasOne(Note::class, 'id', 'note_id');
}
public function operator()
{
return $this->hasOne(User::class, 'id', 'operator_id');
}
}
现在,在我的TasksController
中,我需要得到符合某些标准的任务,像这样:
$tasks = Task::whereCityId($city->id)->whereTypeId($type->id)->get()->toArray();
问题是命名为city_id
type_id
note_id
operator_id
的字段将获得他们拥有的integer
值。
相反,我想从相关的模型中获得一定的值。
例如:
operator_id
应替换为用户id对应的User表中的username
。
一个明显的解决方案,这将是简单地使用foreach
循环,通过我的结果,得到我需要的数据,简单地创建另一个数组的信息替换,但我不确定这是否是最好的主意,也许有更好的东西。
你必须改变你的代码:
$this->hasOne(ClassName::class, 'id', 'foreign_key');
$this->belongsTo(ClassName::class, 'foreign_key', 'id');
,因为Task的id在这些表中不能作为外键使用。这些表的id作为外键出现在任务表中所以必须使用belongsTo()关系告诉脚本这些id属于哪里。
然后这样访问属性:
$tasks = Task::with("type", "city", "operator")
->whereCityId($city->id)->whereTypeId($type->id)->get();
foreach($tasks as $task){
echo $task->city->name;
}
首先你应该修复你的关系:
public function city()
{
return $this->hasOne(City::class,'city_id','id');
}
和一个相同的错误,外键在参数顺序上出现在主键之前。
之后可以使用addSelect:
$tasks = Task::whereCityId($city->id)->whereTypeId($type->id)
->addSelect(['userName' => User::select('name')
->whereColumn('users.id', 'tasks.operator_id')
->limit(1)])->get()->toArray();
我认为这比你要求的更有帮助。
$tasks = Task::whereCityId($city->id)
->whereTypeId($type->id)
->with('operator')
->get()->toArray();
with('operator')
是ORM特性,它使集合包含它的关系作为集合属性。在本例中,它将转换为数组属性。
foreach
函数访问
@foreach($task as $key)
$key['operator']['username']
@endforeach
祝你过得愉快