লারাভেল স্পষ্টতই "উইথ ()" ফাংশন ব্যবহার করে নির্দিষ্ট কলাম পান


197

আমার দুটি টেবিল আছে, Userএবং Post। একজনের Userঅনেকগুলি থাকতে পারে postsএবং একটিতে postকেবল একজনেরই অন্তর্ভুক্ত user

আমার Userমডেলটিতে আমার একটি hasManyসম্পর্ক রয়েছে ...

public function post(){
    return $this->hasmany('post');
}

এবং আমার postমডেলটিতে আমার একটি belongsToসম্পর্ক রয়েছে ...

public function user(){
    return $this->belongsTo('user');
}

এখন আমি এই দুটি টেবিল ব্যবহার করে যোগ দিতে Eloquent with()চাই তবে দ্বিতীয় টেবিল থেকে নির্দিষ্ট কলাম চাই। আমি জানি আমি কোয়েরি বিল্ডারটি ব্যবহার করতে পারি তবে আমি চাই না।

আমি যখন Postমডেলটিতে লিখি ...

public function getAllPosts() {
    return Post::with('user')->get();
}

এটি নিম্নলিখিত প্রশ্নের চালায় ...

select * from `posts`
select * from `users` where `users`.`id` in (<1>, <2>)

তবে আমি যা চাই তা ...

select * from `posts`
select id,username from `users` where `users`.`id` in (<1>, <2>)

আমি যখন ব্যবহার করি ...

Post::with('user')->get(array('columns'....));

এটি কেবল প্রথম সারণী থেকে কলামটি দেয়। আমি with()দ্বিতীয় সারণী থেকে নির্দিষ্ট কলামগুলি ব্যবহার করতে চাই । আমি এটা কিভাবে করবো?

উত্তর:


347

ঠিক আছে আমি সমাধান খুঁজে পেয়েছি। এটি যেমন অ্যারের দ্বিতীয় সূচক হিসাবে একটি closureফাংশন পাস করে একটি করা যেতে পারেwith()

Post::with(array('user'=>function($query){
    $query->select('id','username');
}))->get();

এটা শুধুমাত্র নির্বাচন করব idএবং usernameঅন্যান্য টেবিল থেকে। আমি আশা করি এটি অন্যকে সহায়তা করবে।


মনে রাখবেন যে প্রাথমিক কী (এই ক্ষেত্রে আইডি) প্রথমে প্রয়োজনীয় ফলাফলগুলি পুনরুদ্ধার করতে $ ক্যোয়ারী>> নির্বাচন করুন () নির্বাচন করুন *


1
এটা অদ্ভুত, আমি এই কাজ করতে পারেন না। যত তাড়াতাড়ি আমি যুক্ত করেছিলাম $query->select('id','username');, আমি পেয়ে Trying to get property of non-object
যাচ্ছি

5
অদ্ভুত! এখনও ব্যবহারকারীর সমস্ত ক্ষেত্র প্রদান করে returns @ আওসকির্ণি
জাস্টিন

2
এই ভাগ করার জন্য আপনাকে ধন্যবাদ। আপনি কোথায় এই সম্ভাবনা আবিষ্কার করেছেন? আমি এটি লারাভেল ডক্সে পাইনি।
সাইমেন টিমারম্যানস

80
যারা এটি দেখতে পান তাদের জন্য মনে রাখবেন যে প্রাথমিক কীটি ( idএই ক্ষেত্রে) $query->select()আসলে প্রয়োজনীয় ফলাফলগুলি পুনরুদ্ধার করার জন্য প্রয়োজনীয়। আমি এটিকে আমার কোডে বাদ দিয়েছি এবং কেন এটির কোনও ফলাফল খুঁজে পাবে না তা বুঝতে পারি না। বোকা আমাকে! আশা করি এটি একই সমস্যার সাথে অন্য কাউকে সহায়তা করে
আজিরিয়াস

4
দুর্দান্ত, এখানে কেবল বিদেশী কী যুক্ত করা দরকার, এটির পোস্ট_আইড অন্যথায় ফলাফল খালি হবে। বিদেশী কী উল্লেখ করা এখানে গুরুত্বপূর্ণ। ধন্যবাদ :)
হাসাম আহমেদ

102

লারাভেল ৫.৫ থেকে আপনি এটি এটি করতে পারেন:

Post::with('user:id,username')->get();

idক্ষেত্রের যত্ন এবং ডক্সেforeign keys যেমন বলা হয়েছে :

এই বৈশিষ্ট্যটি ব্যবহার করার সময়, আপনাকে সর্বদা আইডি কলাম এবং যে কোনও প্রাসঙ্গিক বিদেশী কী কলামগুলি পুনরুদ্ধার করতে চান তার তালিকায় অন্তর্ভুক্ত করা উচিত।

উদাহরণস্বরূপ, যদি ব্যবহারকারী কোনও দলে অন্তর্ভুক্ত থাকে এবং তার team_idএকটি বিদেশী কী কলাম রয়েছে, তবে $post->user->teamআপনি যদি নির্দিষ্ট না করেন তবে খালি is team_id

Post::with('user:id,username,team_id')->get();

13
সম্পর্কের সমাধানের জন্য বিদেশী কীটি (এটি এখানে পোস্ট-আইড ধরে ধরে) অন্তর্ভুক্ত করতে ভুলবেন না, অন্যথায় আপনি আপনার সম্পর্কের খালি ফলাফল পাবেন।
হাশাম আহমেদ

2
এটি সত্যই নির্বাচিত উত্তর হওয়া উচিত। কবজির মতো কাজ করে :)
গ্রাহাম

@ অ্যাডাম, এটি চাইল্ড টেবিলে কলামগুলি সীমাবদ্ধ করবে, আমি কীভাবে সন্তানের টেবিলের সাথে টেবিলের প্যারেন্ট টেবিল থেকে কলামগুলি সীমাবদ্ধ রাখতে পারি?
সোডিয়াম

@ গৌরবজেনিয়াস আপনি যে get()পদ্ধতিতে প্যারেন্ট বেলগনস থেকে সীমাবদ্ধ রাখতে চান তার সবকিছুইPost::with('user:id,username')->get(['age', 'color']);
অ্যাডাম

82

আপনার Postমডেল

public function user()
{
    return $this->belongsTo('User')->select(array('id', 'username'));
}

আসল ক্রেডিট লারাভেল ইজিার লোডিংয়ে যায় - কেবলমাত্র নির্দিষ্ট কলামগুলি লোড করুন


14
তবে এই সম্পর্কটি একে একে হার্ডকডযুক্তের মতো করে তুলবে। সমস্ত পরিস্থিতিতে এটি সবসময় আমাকে এই দুটি ক্ষেত্র ফিরিয়ে দেবে। এটি ঘটতে পারে যে অন্য কিছু পরিস্থিতিতে আমার আরও ক্ষেত্রগুলির প্রয়োজন
আওয়েস কার্নি

তারপরে আপনাকে অবশ্যই ক্যোয়ারী বিল্ডারটি ব্যবহার করতে হবে।
ব্যবহারকারী 1669496

5
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। এটি করার সঠিক উপায় এটি।
বাগহান্টরুক

1
লারাভেল 5.3 সংস্করণে এটি করার কোনও উপায় আছে কি? আমি মনে করি তারা এটিকে আবার পরিবর্তন করেছে ... এবং আমি যখন এই পদ্ধতির সাথে চেষ্টা করব তখন এখন তা বাতিল হবে
আন্দ্রে এফ।

এটি কিছুক্ষণ হয়ে গেছে তবে আপনি একটি $fieldsপ্যারামিটার যুক্ত করতে পারেন ।
জর্ডিভিডি

69

অন্য পথে যাওয়ার সময় (অনেকগুলি):

User::with(array('post'=>function($query){
    $query->select('id','user_id');
}))->get();

সম্পর্কের সমাধানের জন্য বিদেশী কী (এটি উদাহরণস্বরূপে ব্যবহারকারী_দ্বারা ধরে নেওয়া) অন্তর্ভুক্ত করতে ভুলবেন না, অন্যথায় আপনি আপনার সম্পর্কের জন্য শূন্য ফলাফল পাবেন।


6
হ্যাঁ, ঠিক, "বিদেশী কীটি অন্তর্ভুক্ত করতে ভুলবেন না (এটি উদাহরণস্বরূপে ব্যবহারকারী_দ্বারা ধরে নেওয়া)"
অ্যাকিংসও

আপনার কলাম নির্বাচন করা ক্ষেত্রগুলিতে আপনার সম্পর্ককে সংজ্ঞায়িত করে এমন কলাম অন্তর্ভুক্ত করা উচিত, এই ক্ষেত্রে ব্যবহারকারী_আইডি
alimfazeli

ভাল লাগল ভাই।
শাহরুখ আনোয়ার

দুর্দান্ত ভাই, বিদেশী কী ব্যবহার করা সত্যিই গুরুত্বপূর্ণ, ভাগ্যবান আমি আপনার উত্তরগুলি দেখেছি অন্যথায় আমি কয়েক ঘন্টা ধরে আমার মাথা আঁচড়ে ফেলতাম। ধন্যবাদ মানুষ!
হাশাম আহমেদ

34

লারাভেল ৫.7 এ আপনি নির্দিষ্ট ক্ষেত্রের মতো কল করতে পারেন

$users = App\Book::with('author:id,name')->get();

foreign_keyনির্বাচনের ক্ষেত্রে ক্ষেত্র যুক্ত করা গুরুত্বপূর্ণ ।


11
বিদেশী কী ক্ষেত্রটি যুক্ত করতে ভুলবেন না
হেন্দ্র 1

2
@ হেন্দ্র 1 এর মন্তব্যটি লক্ষ্য করতে ভুলবেন না, প্রাথমিক কী সহ সমস্ত বিদেশী কী ক্ষেত্রগুলিও প্রয়োজনীয়, অন্যথায় আপনি ফাঁকা সংগ্রহ পাবেন। ডুড আমার সময় বাঁচিয়েছে। ধন্যবাদ
রাজেশ বিষ্ণানী

14

আপনার Postমডেল:

public function userWithName()
{
    return $this->belongsTo('User')->select(array('id', 'first_name', 'last_name'));
}

এখন আপনি ব্যবহার করতে পারেন $post->userWithName


2
সত্যি? আমার জন্য এটি ঠিক কিছু দেয় না, অর্থাত্ এটি এটি ভেঙে দেয়?
Sjwdavies

12

আপনি যদি with()লার্যাভল স্পষ্টভাবে ব্যবহার করে নির্দিষ্ট কলামগুলি পেতে চান তবে আপনি নীচের মত কোড ব্যবহার করতে পারেন যা মূল প্রশ্নের উত্তর হিসাবে অ্যাডাম তার উত্তর এখানে দিয়েছেন :

Post::with('user:id,username')->get();

সুতরাং আমি এটি আমার কোডটিতে ব্যবহার করেছি তবে এটি আমাকে ত্রুটি দিচ্ছিল 1052: Column 'id' in field list is ambiguous, তাই যদি আপনি লোকেরাও একই সমস্যার মুখোমুখি হন

তারপরে এটির সমাধানের জন্য আপনাকে আইডি কলামের আগে টেবিলের নামটি with()নীচের কোড হিসাবে পদ্ধতিতে নির্দিষ্ট করতে হবে :

Post::with('user:user.id,username')->get();

এটি আমার পক্ষে বাতিল হয়ে যায় তবে আমি জানতাম না যে এটি আগে সম্ভব ছিল! ঠিক আছে, তাই আমি প্রিমেটুরলে পোস্ট করেছি তবে আমি একটি ফলাফল পেয়েছি। এই পদ্ধতিটি ব্যবহার করার জন্য (আরও ক্লিনার দেখায়) আপনাকে অবশ্যই সম্পর্কের লিঙ্কটি অন্তর্ভুক্ত করতে হবে, উদাহরণস্বরূপ, আইডি কলামটি যখন ডেটা সহ টানছে। এই নির্দিষ্টকরণ ছাড়াই, আপনি একটি শূন্য রিটার্ন পাবেন।
অ্যাডসি 2010

হ্যাঁ @ অ্যাডসি 2010, সম্পর্কিত সম্পর্কের ডেটা পাওয়ার জন্য আপনাকে আইডি কলাম বা প্রাথমিক কী বা যে কোনও আইডি সেই সম্পর্কের জন্য দায়ী করতে হবে।
হরিতসিংহ গোহিল

10

আমি এই সমস্যাটি জুড়ে এসেছি তবে সম্পর্কিত সামগ্রীর দ্বিতীয় স্তর নিয়ে with @ আওস কার্নির উত্তর নীচে বাছাই করা বিবৃতিতে উপযুক্ত বিদেশী কী অন্তর্ভুক্তির সাথে জড়িত। সম্পর্কিত মডেলটিকে রেফারেন্স দেওয়ার জন্য প্রথম নেস্টেড সিলেক্ট স্টেটমেন্টে যেমন কোনও আইডি প্রয়োজনীয়, তেমন বিদেশী কী সম্পর্কিত মডেলের দ্বিতীয় ডিগ্রি উল্লেখ করতে হবে; এই উদাহরণে কোম্পানির মডেল।

Post::with(['user' => function ($query) {
        $query->select('id','company_id', 'username');
    }, 'user.company' => function ($query) {
        $query->select('id', 'name');
    }])->get();

তদ্ব্যতীত, আপনি যদি পোস্ট মডেল থেকে নির্দিষ্ট কলামগুলি নির্বাচন করতে চান তবে আপনাকে উল্লেখ করতে ইউজার_আইডি কলামটি নির্বাচিত বিবৃতিতে অন্তর্ভুক্ত করতে হবে।

Post::with(['user' => function ($query) {
        $query->select('id', 'username');
    }])
    ->select('title', 'content', 'user_id')
    ->get();

4

মনে রাখবেন যে যদি আপনার কেবল টেবিল থেকে একটি কলামের প্রয়োজন হয় তবে 'তালিকা' ব্যবহার করা বেশ দুর্দান্ত। আমার ক্ষেত্রে আমি ব্যবহারকারীর প্রিয় নিবন্ধগুলি পুনরুদ্ধার করছি তবে আমি কেবল নিবন্ধের আইডি চাই:

$favourites = $user->favourites->lists('id');

আইডির একটি অ্যারে প্রদান করে, যেমন:

Array
(
    [0] => 3
    [1] => 7
    [2] => 8
)

এটি একটি সংগ্রহ ফেরত!
জিওভান্নি Far

আপনি যদি অ্যারে চান তবে কল করুন toArray()!!! $user->favourites->lists('id')->toArray();
জিওভান্নি Far

কোয়েরিটি এখনও অন্য কলামগুলি পাবে কারণ তালিকার () পদ্ধতিটি কেবল ফলাফলের অ্যারে পরিবর্তন করে, সুতরাং যদি আপনাকে কেবল সেই টেবিল থেকে 'আইডি' প্রয়োজন হয় তবে আপনি এটি ক্যোয়ারিতে উল্লেখ করতে চাইতে পারেন। অনুসন্ধানগুলি করার সময় কর্মক্ষমতা মাথায় রাখা সর্বদা একটি ভাল অভ্যাস। কোডিং উপভোগ করুন!
এরভিন ললজকু

-1 নির্বাচিত সমস্ত ক্ষেত্রের সাথে $user->favouritesফিরে আসবে Collection। সঠিক ব্যবহার: $user->favourites()->lists('id')
ওয়ালেস ম্যাক্সটার 10

পিএইচপি ফিল্টারিং ব্যবহারের জন্য পরে সমস্ত কিছু নির্বাচন করা একটি খারাপ ধারণা। ক্যোয়ারিতে শুধুমাত্র প্রয়োজনীয় ক্ষেত্রগুলি ব্যবহার করা ভাল। Query\Builder::listsপদ্ধতি এবং Collection::listsপদ্ধতির মধ্যে পার্থক্যটি জানা গুরুত্বপূর্ণ ।
ওয়ালেস ম্যাক্সটার 10

1

এটি অ্যাক্সেস করার সময় আপনি সম্পর্কিত মডেলের কলামগুলিও নির্দিষ্ট করতে পারেন।

Post::first()->user()->get(['columns....']);


0

এখন আপনি pluckএকটি Collectionউদাহরণে পদ্ধতিটি ব্যবহার করতে পারেন :

এটি কেবলমাত্র এর uuidবৈশিষ্ট্যটি ফিরিয়ে দেবেPost model

App\Models\User::find(2)->posts->pluck('uuid')
=> Illuminate\Support\Collection {#983
     all: [
       "1",
       "2",
       "3",
     ],
   }


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.